Logstash事件字段引用不生效 无法正确提取product字段值如何解决
问题背景
从Python向Logstash传入的事件结构如下:
{ "@timestamp":"2022-06-13T16:48:39.422Z", "@version":"1", "message":"Something happened", "host":"Not important", "path":"Not important", "tags":[], "type":"logstash", "level":"INFO", "logger_name":"python-logstash-logger", "product":"MySoftware" }
需求是提取事件中的product字段,供后续Kibana使用。
之前尝试使用的filter配置:
filter { mutate { add_field => { "Product" => "%{product}" } } }
实际输出为Product = %{product},不符合预期的Product = MySoftware结果。
故障原因
%{product}格式没有被解析为实际字段值,核心原因是mutate执行add_field操作时,当前事件上下文里不存在根层级的product字段,常见触发场景:
- filter插件顺序错误:新增字段的mutate配置放在了日志格式解析插件(json/grok等)之前,原始传入的日志还没被拆解为独立字段,自然无法引用到
product - 字段层级错误:
product没有被解析到事件根目录,而是嵌套在其他子字段下,直接写%{product}无法匹配到对应路径
正确配置方案
根据实际场景选择对应配置即可:
- 调整filter执行顺序,先完成日志格式解析,再操作字段
如果Python端发送的是JSON格式日志,必须先通过json插件把原始日志内容解析为根层级的独立字段,再执行字段新增操作,参考配置:filter { # 第一步:解析message字段中存储的JSON日志内容,拆解为独立字段 json { source => "message" target => "" } # 第二步:字段解析完成后,再新增目标字段 mutate { add_field => { "Product" => "%{[product]}" } } } - 补全嵌套字段的引用路径
如果解析后product存在于嵌套结构中,比如在fields子字段下,把字段引用修改为对应完整路径即可:%{[fields][product]} - 优先使用copy配置做字段复制
如果只是要把现有product字段的值同步到新的Product字段,用mutate的copy选项更稳定,不需要依赖sprintf字符串解析逻辑:filter { json { source => "message" } mutate { copy => { "product" => "Product" } } }
调试提示:配置调试阶段可以开启stdout输出插件,使用rubydebug编码格式打印全量事件内容,确认
product字段的实际存在层级和解析时机,再调整filter顺序与字段引用路径。
内容的提问来源于stack exchange,提问作者Jarkness Ferture
相关产品推荐
相关产品推荐

