Kubernetes中Fluentd解析带前缀Nginx JSON访问日志方法
场景说明
这是Kubernetes环境下采集容器化Nginx日志的通用标准场景。日志前缀并非Fluentd添加,是容器运行时(Docker/Containerd)写入/var/log/containers/路径日志的标准CRI格式,固定结构为:[RFC3339格式时间戳] [输出流stdout/stderr] [日志标记F/P] [容器原始输出内容]。
你当前使用的fluent/fluentd-kubernetes-daemonset:v1.14.6-debian-elasticsearch7-1.0镜像已预置全部所需解析能力,不需要安装任何额外插件,调整采集规则即可完成正确解析。
正确配置方案
直接替换原有source段的解析配置,用两层嵌套解析分别处理外层CRI格式、内层Nginx输出的JSON格式:
<source> @type tail path /var/log/containers/*nginx*.log pos_file /var/log/nginx.log.pos tag nginx.access <parse> # 第一层:解析CRI日志外层前缀 @type cri <parse> # 第二层:解析Nginx输出的原生JSON日志 @type json time_key time_local time_format %d/%b/%Y:%H:%M:%S %z </parse> </parse> </source>
配置生效后自动完成以下处理:
- 自动剥离CRI格式前缀,不会把时间戳、stdout标识混入业务日志字段
- 自动处理JSON转义字符,将Nginx
log_format中定义的remote_addr、status、request_time等所有字段直接映射为Elasticsearch的独立可检索字段 - 自动使用Nginx日志自带的
time_local作为日志事件时间,不依赖Fluentd采集时间生成时间戳,时间精度和准确性更高
可选优化配置
如果不需要保留CRI层解析出的冗余字段,可以添加如下过滤规则清理无效字段:
<filter nginx.access> @type record_transformer remove_keys stream, time </filter>
原有配置问题说明
之前配置的@type nginx解析器是专门适配Nginx默认文本格式日志的,搭配全量匹配正则^(?<somenginxstuff>.*)$相当于未做任何结构化处理,所有日志内容会被塞入单个字段,无法正常检索分析。
内容的提问来源于stack exchange,提问作者Matt The Ninja
相关产品推荐
相关产品推荐

