Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging Kibana-如何从现有Kubernetes日志中提取字段_Logging_Kubernetes_Kibana_Elastic Stack_Fluentd - Fatal编程技术网

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

Logging Kibana-如何从现有Kubernetes日志中提取字段,logging,kubernetes,kibana,elastic-stack,fluentd,Logging,Kubernetes,Kibana,Elastic Stack,Fluentd,我有一种ELK堆栈,使用fluentd而不是logstash,作为Kubernetes集群上的守护程序运行,并以logstash格式将所有容器中的所有日志发送到Elasticsearch服务器 在Kubernetes集群上运行的许多容器中,有些是nginx容器,它们输出以下格式的日志: 121.29.251.188 - [16/Feb/2017:09:31:35 +0000] host="subdomain.site.com" req="GET /data/schedule/update?dat

我有一种ELK堆栈,使用fluentd而不是logstash,作为Kubernetes集群上的守护程序运行,并以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中可见的字段如下所示:

在对此类日志编制索引后,是否可以从中提取字段

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>

型尾
路径/var/log/containers/*.log
pos_文件/var/log/es-containers.log.pos
时间\u格式%Y-%m-%dT%H:%m:%S.%NZ
塔格·库伯内特斯*
格式json
从你的头上读出来是真的

在理想情况下,我想用“日志”字段中的元字段(如“主机”、“请求”、“状态”等)丰富上面屏幕截图中可见的字段。

为了将日志行提取到字段中,您可能必须使用过滤器。您可以做的是拥有一个正则表达式模式,以匹配所需的日志行的确切部分Grok过滤器可能如下所示:

grok {
    patterns_dir => ["pathto/patterns"]
    match => { "message" => "^%{LOGTIMESTAMP:logtimestamp}%{GREEDYDATA:data}" }         
}                                                 ^-----------------------^ are the fields you would see in ES when log is being indexed
----------------------------------------------------^
LOGTIMESTAMP
应该在模式文件中定义如下:

LOGTIMESTAMP %{YEAR}%{MONTHNUM}%{MONTHDAY} %{TIME}
一旦有了匹配的字段,您就可以简单地将它们用于
过滤
目的,或者如果主要原因是从日志行提取字段,您也可以保持原样

if "something" in [message]{
     mutate {
         add_field => { "new_field" => %{logtimestamp} }
     }          
}
以上只是一个示例,您可以复制它以满足您的需要。您可以使用该工具来测试您的模式以及您想要匹配的字符串


,可能很方便!希望这能有所帮助。

经过几天的研究和习惯,我找到了一种针对EFK的解决方案,与达斯·维德的答案相反,后者只适用于麋鹿群

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

事实证明,Fluentd通过使用具有自己的字段提取功能。为了解决我问题中的问题,就在
行之前,因此在日志行对象已经使用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>

类型分析器
密钥名称日志
保留数据是
format/^(?[^-]*)-\[(?[^\]*)\]host=“(?[^”]*)”req=“(?[^]*)(?[^]*)(?[^]*)”status=(?[^]*)body_bytes=(?[^]*)referer=“(?[^”]*)user_-agent=“(?[^]*)”时间=(?[^]*))/
解释:

-在与此标签匹配的所有行上应用块;在我的例子中,web服务器组件的容器称为webapp-{something}

类型解析器
-告诉fluentd应用解析器过滤器

key\u name log
-仅在日志行的
log
属性上应用模式,而不是整行,这是一个json字符串

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

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


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

感谢您的回答,@Darth_vader。我知道这可以通过logstash实现,但我使用fluentd进行日志收集,请参阅我问题中的配置。你知道如何使用fluentd开箱即用吗?我们如何使用fluent bit进行同样的操作?@bediabza你介意分享你的配置图以及如何设置吗?我不得不稍微更新一下,并使用Fluentular更正了过滤器,并且能够验证它,但它没有将过滤器应用到我们的日志中。ThanksI还可以使用elasticsearch摄取节点