在fluentd中解析nginx入口日志

     2023-02-15     142

关键词:

【中文标题】在fluentd中解析nginx入口日志【英文标题】:Parse nginx ingress logs in fluentd 【发布时间】:2017-02-06 03:04:10 【问题描述】:

我想在 Kubernetes 中使用 fluentd 解析入口 nginx 日志。这在 Logstash 中很容易,但我对流畅的语法感到困惑。

现在我有以下规则:

<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
  keep_time_key true
</source>

<filter kubernetes.**>
  type kubernetes_metadata
</filter>

结果我得到了这个日志,但它没有被解析:

127.0.0.1 - [127.0.0.1] - user [27/Sep/2016:18:35:23 +0000] "POST /elasticsearch/_msearch?timeout=0&ignore_unavailable=true&preference=1475000747571 HTTP/2.0" 200 37593 "http://localhost/app/kibana" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Centos Chromium/52.0.2743.116 Chrome/52.0.2743.116 Safari/537.36" 951 0.408 10.64.92.20:5601 37377 0.407 200

我想应用过滤规则,以便能够在 Kibana 中按 IP 地址、HTTP 方法等进行搜索。我该如何实现?

【问题讨论】:

【参考方案1】:

logstash 和 fluentd 中的管道完全不同。并且花了一些时间来构建工作 Kubernetes -> Fluentd -> Elasticsearch -> Kibana 解决方案。

对我的问题的简短回答是安装 fluent-plugin-parser 插件(我想知道为什么它不在标准包中提供)并将此规则放在 kubernetes_metadata 之后过滤器:

<filter kubernetes.var.log.containers.nginx-ingress-controller-**.log>
  type parser
  format /^(?<host>[^ ]*) (?<domain>[^ ]*) \[(?<x_forwarded_for>[^\]]*)\] (?<server_port>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+[^\"])(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")? (?<request_length>[^ ]*) (?<request_time>[^ ]*) (?:\[(?<proxy_upstream_name>[^\]]*)\] )?(?<upstream_addr>[^ ]*) (?<upstream_response_length>[^ ]*) (?<upstream_response_time>[^ ]*) (?<upstream_status>[^ ]*)$/
  time_format %d/%b/%Y:%H:%M:%S %z
  key_name log
  types server_port:integer,code:integer,size:integer,request_length:integer,request_time:float,upstream_response_length:integer,upstream_response_time:float,upstream_status:integer
  reserve_data yes
</filter>

这里有很多例子的长答案:https://github.com/kayrus/elk-kubernetes/

【讨论】:

嘿。我收到如下错误:, key "code:integer" has no value (cannot end with ,)。似乎type @parser 根本没有types 这样的方法。至少我找不到。【参考方案2】:
<match fluent.**>
  @type null
</match>

<source>
 @type tail
 path /var/log/containers/nginx*.log
 pos_file /data/fluentd/pos/fluentd-nginxlog1.log.pos
 tag nginxlogs
 format none
 read_from_head true
</source>

<filter nginxlogs>
  @type parser
  format json
  key_name message
</filter>


<filter nginxlogs>
  @type parser
  format /^(?<host>[^ ]*) (?<domain>[^ ]*) \[(?<x_forwarded_for>[^\]]*)\] (?<server_port>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+[^\"])(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*) "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<request_length>[^ ]*) (?<request_time>[^ ]*) (?:\[(?<proxy_upstream_name>[^\]]*)\] )?(?<upstream_addr>[^ ]*) (?<upstream_response_length>[^ ]*) (?<upstream_response_time>[^ ]*) (?<upstream_status>[^ ]*) \w*$/
  time_format %d/%b/%Y:%H:%M:%S %z
  key_name log
#  types server_port:integer,code:integer,size:integer,request_length:integer,request_time:float,upstream_response_length:integer,upstream_response_time:float,upstream_status:integer
</filter>

<match nginxlogs>
  @type stdout
</match>

【讨论】:

【参考方案3】:

您可以使用多格式解析器插件,https://github.com/repeatedly/fluent-plugin-multi-format-parser

 <match>
   format multi_format
   <pattern>
     format json
   </pattern>
   <pattern>
     format regexp...
     time_key timestamp
   </pattern>
   <pattern>
     format none
   </pattern>
 </match>

注意:我很好奇最终的 conf 是什么样的,包括过滤器解析器。

【讨论】:

【参考方案4】:

因为,你使用 json 格式进行解析。 尝试这个。 http://docs.fluentd.org/articles/recipe-nginx-to-elasticsearch

如果您使用自定义格式,您可能需要编写自己的正则表达式。 http://docs.fluentd.org/articles/in_tail

【讨论】:

在fluentd中如何解析日志并根据键值创建字段

】在fluentd中如何解析日志并根据键值创建字段【英文标题】:Influentdhowtoparselogsandcreatefieldsbasedonkeyvalues【发布时间】:2019-12-1623:39:38【问题描述】:在fluentd中,我如何使用grok模式或json解析此日志并获取ip、方法和严重性等字段... 查看详情

fluentd解析日志部分json

】fluentd解析日志部分json【英文标题】:fluentdparselogpartiallyjson【发布时间】:2021-06-0111:05:33【问题描述】:我在fluentd中有一个来自syslogproto的源代码,但该行并不完全符合syslog。142>May3116:22:56haproxy[77]:"ident":"haproxy","client_ip":"172... 查看详情

fluentd解析httpd日志(代码片段)

...)AppleWebKit/537.36(KHTML,likeGecko)Chrome/79.0.3945.130Safari/537.36"fluentd配置<source>@idhttpd@typetailpath/data/logs/kim-todo-api-prod/log/statistics.logpos_file/home/web_server/ingress-nginx/statistics.log.postag*read_from_headtrueformat/^(?<host>[^]*)[^]*(?<user>[^]*)[... 查看详情

在 FluentD 中解析内部 JSON

】在FluentD中解析内部JSON【英文标题】:ParsinginnerJSONinsideFluentD【发布时间】:2017-06-1820:52:41【问题描述】:我通过FluentD驱动程序从docker容器发出了一些JSON,例如:\'"timeMillis":1485917543709,"thread":"main","level":"INFO","loggerName":"com.imagei... 查看详情

python获取nginx子请求

...usModule模块,获取实时请求信息;4、使用第三方工具,如Fluentd,Logstash,实时解析并传送Nginx日志。项目需求测试过程中,需要向Nginx服务器发送一些用例请求,然后查看对应的Nginx日志,判断是否存在特征内容,来判断任务是否... 查看详情

在 fluentd 中使用具有不同匹配类型的单个源

】在fluentd中使用具有不同匹配类型的单个源【英文标题】:Usingasinglesourceinfluentdwithdifferentmatchtypes【发布时间】:2020-08-0412:18:14【问题描述】:所以我试图从运行在主机上的docker容器捕获输出,但是在开发人员更改为使用json作... 查看详情

Fluentd - 如何解析其消息为 JSON 格式解析且其消息为文本的日志;原样不会因为解析错误而丢失

】Fluentd-如何解析其消息为JSON格式解析且其消息为文本的日志;原样不会因为解析错误而丢失【英文标题】:Fluentd-HowtoparselogswhosemessagesareJSONformattedparsedANDwhosemessagesareintext;asiswithoutgettinglostduetoparseerror【发布时间】:2021-09-1000:59... 查看详情

在asp.netcore中使用serilog使用fluentd将日志写入elasticsearch(代码片段)

在ASP.NETCore中使用Serilog使用Fluentd将日志写入Elasticsearch原文来自:https://andrewlock.net/writing-logs-to-elasticsearch-with-fluentd-using-serilog-in-asp-net-core/对于在Kubernetes中运行的应用程序,将日志消息存储在一个中心位置 查看详情

fluentd 丢失毫秒,现在日志消息在 elasticsearch 中乱序存储

】fluentd丢失毫秒,现在日志消息在elasticsearch中乱序存储【英文标题】:fluentdlosesmillisecondsandnowlogmessagesarestoredoutoforderinelasticsearch【发布时间】:2015-03-1118:47:31【问题描述】:我正在使用fluentd将日志消息集中在elasticsearch中,并... 查看详情

使用fluentd收集docker容器日志

参考技术A本文介绍使用Fluentd收集standalone容器日志的方法。Docker提供了很多loggingdriver,默认情况下使用的json-file,它会把容器打到stdout/stderr的日志收集起来存到json文件中,dockerlogs所看到的日志就是来自于这些json文件。当有多... 查看详情

FluentD 日志不可读。它被排除在外,下次会检查

】FluentD日志不可读。它被排除在外,下次会检查【英文标题】:FluentDlogunreadable.itisexcludedandwouldbeexaminednexttime【发布时间】:2019-01-1106:19:49【问题描述】:面对:流利的日志不可读。已排除,下次会检查我有一个在kubernetes设置... 查看详情

elastic:fluentd在elasticstack中的运用(代码片段)

在我之前的文章“Elastic:使用Fluentd及ElasticStack进行应用日志采集”,我详细地介绍了如何使用ElasticStack及Fluentd来收集一个nodejs服务器的日志信息。在今天的文章中,我将详细地介绍如何使用Docker来部署ElasticStack及Flu... 查看详情

elastic:fluentd在elasticstack中的运用(代码片段)

在我之前的文章“Elastic:使用Fluentd及ElasticStack进行应用日志采集”,我详细地介绍了如何使用ElasticStack及Fluentd来收集一个nodejs服务器的日志信息。在今天的文章中,我将详细地介绍如何使用Docker来部署ElasticStack及Flu... 查看详情

万能日志数据收集器fluentd-每天5分钟玩转docker容器技术(91)

...Docker默认的loggingdriver json-file,本节我们将使用 fluentd 来收集容器的日志。Fluentd是一个开源的数据收集器,它目前有超过500种的plugin,可以连接各种数据源和数据输出组件。在接下来的实践中,Fluentd会负责收集容器... 查看详情

分布式框架-日志系统思路及实现

...并发送给对应的解析器,常见的采集器有flume、logstash、fluentd以及更轻量级的fluent-bit解析器通常和采集器结合在一起,也有一部分解析器是通过接收缓冲队列,将日志解析成json格式数据后,把数据发往存储器进行存储存储器用... 查看详情

NGINX 入口控制器在 60 秒后超时请求

】NGINX入口控制器在60秒后超时请求【英文标题】:NGINXingresscontrollertimingoutrequestafter60s【发布时间】:2019-06-1908:03:46【问题描述】:当一个请求需要超过60秒来响应时,入口控制器似乎会弹跳据我所知,我们的NGINX入口控制器在处... 查看详情

rancher使用fluentd-pilot收集日志分享

fluentd-pilot简介fluentd-pilot是阿里开源的docker日志收集工具,Github项目地址:https://github.com/AliyunContainerService/fluentd-pilot。你可以在每台机器上部署一个fluentd-pilot实例,就可以收集机器上所有Docker应用日志。fluentd-pilot具有如下特性... 查看详情

elk系列~对fluentd参数的理解

这段时候一直在研究ELK框架,主要集成在对fluentd和nxlog的研究上,国内文章不多,主要看了一下官方的API,配合自己的理解,总结了一下,希望可以帮到刚入行的朋友们!Fluentd(日志收集与过滤,server)Fluentd是一个免费,而且完... 查看详情