gpt4 book ai didi

logging - Kibana - 如何从现有 Kubernetes 日志中提取字段

转载 作者:行者123 更新时间:2023-12-02 11:06:14 28 4
gpt4 key购买 nike

我有一种 ELK 堆栈,使用 Fluentd 而不是 Logstash,作为 Kubernetes 集群上的 DaemonSet 运行,并将所有容器中的所有日志以 Logstash 格式发送到 Elasticsearch 服务器。

在 Kubernetes 集群上运行的众多容器中,有一些是 nginx 容器,它们输出以下格式的日志:

121.29.251.188 - [16/Feb/2017:09:31:35 +0000] host="subdomain.site.com" req="GET /data/schedule/update?date=2017-03-01&type=monthly&blocked=0 HTTP/1.1" status=200 body_bytes=4433 referer="https://subdomain.site.com/schedule/2589959/edit?location=23092&return=monthly" user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0" time=0.130 hostname=webapp-3188232752-ly36o

Kibana 中可见的字段如以下屏幕截图所示:

kibana nginx log

这种类型的日志建立索引后是否可以提取字段?

Fluentd 收集器配置了以下源,它处理所有容器,因此由于不同容器的输出非常不同,因此在此阶段强制执行格式是不可能的:

<source>
type tail
path /var/log/containers/*.log
pos_file /var/log/es-containers.log.pos
time_format %Y-%m-%dT%H:%M:%S.%NZ
tag kubernetes.*
format json
read_from_head true
</source>

在理想情况下,我想使用“log”字段中的元字段来丰富上面屏幕截图中可见的字段,例如“host”、“req”、“status”等。

最佳答案

经过几天的研究并习惯了 EFK stack ,我找到了 EFK 特定的解决方案,而不是 Darth_Vader 的答案,后者只能在 ELK 堆栈上实现。

总而言之,我使用 Fluentd 而不是 Logstash,因此如果您还安装 Fluentd Grok Plugin ,任何 grok 解决方案都可以工作。 ,我决定不这样做,因为:

事实证明,Fluentd 通过使用 parser filters 拥有自己的字段提取功能。 。为了解决我的问题,就在 <match **> 之前行,因此在日志行对象已经使用 kubernetes 元数据字段和标签丰富之后,我添加了以下内容:

<filter kubernetes.var.log.containers.webapp-**.log>
type parser
key_name log
reserve_data yes
format /^(?<ip>[^-]*) - \[(?<datetime>[^\]]*)\] host="(?<hostname>[^"]*)" req="(?<method>[^ ]*) (?<uri>[^ ]*) (?<http_version>[^"]*)" status=(?<status_code>[^ ]*) body_bytes=(?<body_bytes>[^ ]*) referer="(?<referer>[^"]*)" user_agent="(?<user_agent>[^"]*)" time=(?<req_time>[^ ]*)/
</filter>

解释一下:

<filter kubernetes.var.log.containers.webapp-**.log> - 将 block 应用到与该标签匹配的所有行上;在我的例子中,Web 服务器组件的容器称为 webapp-{something}

type parser - 告诉 Fluentd 应用解析器过滤器

key_name log - 仅将模式应用于 log日志行的属性,不是整行,是一个json字符串

reserve_data yes - 非常重要,如果未指定,整个日志行对象将仅替换为从 format 中提取的属性,所以如果您已经有其他属性,例如 kubernetes_metadata 添加的属性过滤器,如果不添加reserve_data,这些将被删除选项

format - 应用于 log 值的正则表达式提取命名属性的关键

请注意,我使用的是 Fluentd 1.12,因此此语法与较新的 1.14 语法不完全兼容,但只需对解析器声明进行细微调整即可使用该原理。

关于logging - Kibana - 如何从现有 Kubernetes 日志中提取字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42270621/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com