如何在Logstash中从message字段提取等号后的值生成新字段?
问题描述
我的日志里的message字段内容是这样的:
"message":"name="Alert notification" event_id=123 alert_name="alert 1234" ipaddr="192.168.0.1" object_name="localhost.local""
我想通过Grok过滤器把等号后面的值提取出来作为新字段,最终要得到这样的结果:
"alert_name":"alert 1234", "object_name":"localhost.local", "ipaddr":"192.168.0.1"
我试过下面这个Grok配置,但它会把整个键值对都抓进去(比如得到"alert_name":"alert_name"="alert 1234"),完全不符合预期:
grok { match => { "message" => "%{WORD:method1} %{WORD:method2} %{WORD:method3}" } }
请问怎么才能只提取等号后面的值作为新字段的内容?
解决方案
你可以用精准的Grok匹配规则,直接定位目标字段的键和等号后的取值。下面是适配你日志格式的配置:
grok { match => { "message" => '%{DATA:ignore1}alert_name="%{DATA:alert_name}" %{DATA:ignore2}ipaddr="%{DATA:ipaddr}" %{DATA:ignore3}object_name="%{DATA:object_name}"' } remove_field => ["ignore1", "ignore2", "ignore3"] # 删掉临时用的冗余字段 }
规则说明:
%{DATA:字段名}:DATA模式可以匹配除换行外的任意字符,适合捕获像alert 1234这种带空格的取值。- 用
alert_name="%{DATA:alert_name}"这种格式,精准匹配alert_name="开头、"结尾的部分,把中间内容直接存为alert_name字段。 ignore1/ignore2/ignore3是临时字段,用来跳过不需要的前置内容,最后用remove_field清理即可。
如果你的日志字段顺序不固定,也可以用更灵活的写法逐个匹配目标字段:
grok { match => { "message" => [ 'alert_name="%{DATA:alert_name}"', 'ipaddr="%{DATA:ipaddr}"', 'object_name="%{DATA:object_name}"' ] } }
这种写法不管字段在日志中的顺序如何,都能正确提取对应的值。
内容的提问来源于stack exchange,提问作者exclbr5
相关产品推荐
相关产品推荐

