K8s下Nginx日志host值覆盖Filebeat至Logstash的host元数据
K8s Nginx 日志采集链路字段冲突异常
现有链路及各组件配置
- Nginx 配置(
nginx.conf)- http块中定义
escape=json的日志格式,包含字段:request_id、method、status、forwarded_for、host、url、referer、remote_ip、server_ip、user_agent - server块配置访问日志输出路径为
/var/log/nginx/access.json
- http块中定义
- Filebeat 配置(
filebeat.yml)- 全局配置
shutdown_timeout: 5s - 日志输入:采集路径为
/var/log/nginx/access.json*,排除.gz后缀的压缩文件,为采集的日志打上access标签 - 日志处理:配置
decode_json_fields处理器解析message字段的JSON内容,设置overwrite_keys: true,预期该配置可覆盖组件自带元数据 - 输出配置:对接集群内Logstash服务的5044端口
- 全局配置
- Logstash 配置(
logstash.conf)- 输入配置:通过beats输入端口5044接收Filebeat传输的数据
- 日志处理:对携带
access标签的日志,先将tags值写入@metadata,再移除agent、event、service、log、input、container、kubernetes等冗余元数据字段 - 输出配置:对接Google Cloud Storage存储桶存储Nginx访问日志
异常运行现象
- 链路初期运行完全符合预期:最终输出日志中的host字段为Nginx记录的业务域名值
- 近期出现异常:正常Nginx日志输出完成后,连续产生多条结构为
{"host":{"name":"filebeat-adio3"}}的无效数据
核心待解决问题
- 上述异常host数据的产生原因,是Filebeat配置问题还是Logstash配置问题?
- 如何配置合理的过滤规则,避免业务日志的host字段与Filebeat、Logstash的自带元数据字段冲突,确保最终输出的host字段为Nginx记录的业务值,而非Filebeat所在节点的主机名?
内容的提问来源于stack exchange,提问作者iooi
相关产品推荐
相关产品推荐

