使用多格式解析器(Regex)解析FluentD中的Nginx入口访问日志

使用多格式解析器(Regex)解析FluentD中的Nginx入口访问日志,regex,nginx,nginx-ingress,fluentd,Regex,Nginx,Nginx Ingress,Fluentd,我在K8S集群中有一个Nginx入口控制器,它具有以下日志格式(我从容器中的/etc/Nginx/Nginx.conf获取): 我的目标是解析Nginx日志并将其推送到CW。请注意,Nginx日志文件包含Nginx应用程序日志(例如,信息和警告日志)以及访问日志。我的理解是我必须使用多格式分析器插件。因此,我将FluentD配置如下(请参见@nginx过滤器的表达式): @型尾 @尾部容器日志中的id @标签@容器 路径/var/log/containers/*.log 排除路径[“/var/

我在K8S集群中有一个Nginx入口控制器,它具有以下日志格式(我从容器中的
/etc/Nginx/Nginx.conf
获取):

我的目标是解析Nginx日志并将其推送到CW。请注意,Nginx日志文件包含Nginx应用程序日志(例如,信息和警告日志)以及访问日志。我的理解是我必须使用多格式分析器插件。因此,我将FluentD配置如下(请参见
@nginx
过滤器的
表达式
):


@型尾
@尾部容器日志中的id
@标签@容器
路径/var/log/containers/*.log
排除路径[“/var/log/containers/cloudwatch agent*”、“/var/log/containers/fluentd*”、“/var/log/containers/nginx*”]
pos_文件/var/log/fluentd-containers.log.pos
标签*
从你的头上读出来是真的
@类型json
时间\u格式%Y-%m-%dT%H:%m:%S.%NZ
@型尾
@容器日志中的id
@标签@nginx
路径/var/log/containers/nginx*.log
pos_文件/var/log/fluentd-nginx.log.pos
标签*
从你的头上读出来是真的
@类型json
时间\u格式%Y-%m-%dT%H:%m:%S.%NZ
@型尾
@在\u tail\u cwagent\u日志中的id
@标签@cwagentlogs
路径/var/log/containers/cloudwatch代理*
pos_文件/var/log/cloudwatch-agent.log.pos
标签*
从你的头上读出来是真的
@类型json
时间\u格式%Y-%m-%dT%H:%m:%S.%NZ
@类型分析器
密钥名称日志
格式json
保留数据为真
@类型kubernetes\u元数据
@id筛选器\u kube\u元数据
@型记录变压器
@id过滤器\u容器\u流\u转换器
流名称${tag\u parts[3]}
@海螺型
密钥日志
多行\u开始\u regexp/^\S/
分隔符“”
冲洗间隔5
正常情况下的超时\u标签
@类型重新标记
@标签@正常
@类型kubernetes\u元数据
@id筛选器\u nginx\u kube\u元数据
@型记录变压器
@id筛选器\u nginx\u容器\u流\u转换器
流名称${tag\u parts[3]}
@类型分析器
密钥名称日志
@键入多字符格式
格式regexp
表达式/^(?[^]*)(?[^]*)\[(?[^\]*)\](?[^]*)-(?[^]*)\[(?[^\]*)”(?:+(?[^\“]*)(?:+(?:+\S*)(?
[^]*)(?[^*)(?:“(?[^\]*)”)(?:(?:“(?[^\]*)”)”)(?[^*))(?[^*))))(?)?(?[^]*)(?[^]*)(?:\[(?[^\]*))\](?:\[(?[^\]*))\])(?[^]*)(?[^]*)(?[^]*)(?[^]*)(?[^]*)(?[^]*)\n$/
@类型重新标记
@标签@正常
@类型kubernetes\u元数据
@id筛选器\u kube\u元数据\u cwagent
@型记录变压器
@id筛选器\u cwagent\u流\u转换器
流名称${tag\u parts[3]}
@海螺型
密钥日志
多行\u start\u regexp/^\d{4}[-/]\d{1,2}[-/]\d{1,2}/
分隔符“”
冲洗间隔5
正常情况下的超时\u标签
@类型重新标记
@标签@正常
@输入cloudwatch\u日志
@标识出\u cloudwatch\u日志\u容器
区域“#{ENV.fetch('region')}”
log_group_name”/aws/containerinsights/#{ENV.fetch('CLUSTER_name')}/application
日志\流\名称\密钥流\名称
删除\u日志\u流\u名称\u密钥true
自动创建流为真
冲洗间隔5
块大小限制为2m
排队的\u块\u限制\u大小32
你永远是真的
现在我看到以下日志的解析器错误:

...#0 dump an error event: error_class=Fluent::Plugin::Parser::ParserError error_class=Fluent::Plugin::Parser::ParserError error="pattern not matched with data '10.0.1.2 - - [25/Aug/2020:11:43:09 +0000] \"GET /favicon.ico HTTP/1.1\" 499 0 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko/ Firefox/79.0\" 901 0.000 [develop-api-8080] [] 10.0.2.3:8080 0 0.000 - 3a3d3bbd02a633aaaab2af3b5284a0c9\n'"
..."log"=>"10.0.1.2 - - [25/Aug/2020:11:43:09 +0000] \"GET /favicon.ico HTTP/1.1\" 499 0 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko/20100101 Firefox/79.0\" 901 0.000 [develop-api-8080] [] 10.0.2.3:8080 0 0.000 - 3a3d3bbd02a633aaaab2af3b5284a0c9\n"

我不确定问题是否与我的正则表达式或配置的其他部分有关。(注意,我还没有为Nginx应用程序日志添加解析器!)。谢谢。

这本身不是答案,因为我认为正则表达式不太正确。但由于我已经访问了Ngnix,我只是将日志格式更改为JSON,而不是使用正则表达式对其进行解析:

'log-format-upstream': '{ "app": "nginx", "time":"$time_iso8601", "remote_addr":"$remote_addr", "remote_user":"$remote_user", "forwarded_for":"$http_x_forwarded_for", "host":"$host", "res_status":"$status", "res_body_size":"$body_bytes_sent", "res_size":"$bytes_sent", "req_id":"$req_id", "req_uri":"$uri", "req_time":"$request_time", "req_proto":"$server_protocol", "req_query":"$query_string", "req_length":"$request_length", "req_method":"$request_method", "agent":"$http_user_agent", "up_name": "$proxy_upstream_name", "up_addr": "$upstream_addr", "up_res_status": "$upstream_status", "up_res_time": "$upstream_response_time", "up_res_length": "$upstream_response_length" }'
'log-format-upstream': '{ "app": "nginx", "time":"$time_iso8601", "remote_addr":"$remote_addr", "remote_user":"$remote_user", "forwarded_for":"$http_x_forwarded_for", "host":"$host", "res_status":"$status", "res_body_size":"$body_bytes_sent", "res_size":"$bytes_sent", "req_id":"$req_id", "req_uri":"$uri", "req_time":"$request_time", "req_proto":"$server_protocol", "req_query":"$query_string", "req_length":"$request_length", "req_method":"$request_method", "agent":"$http_user_agent", "up_name": "$proxy_upstream_name", "up_addr": "$upstream_addr", "up_res_status": "$upstream_status", "up_res_time": "$upstream_response_time", "up_res_length": "$upstream_response_length" }'