如何在Logstash中从文本+JSON混合日志提取有效JSON部分
解决方案
1. 调整Logstash输入配置
先去掉原来的codec => json,改用plain codec(默认即为plain,也可显式声明),确保整个混合日志内容被完整接收为message字段:
input { syslog { port => 5044 codec => plain } }
2. 配置Filter组件提取并解析JSON
用grok先把日志里的JSON部分单独提取出来,再通过json过滤器将其解析为独立业务字段,最后清理掉无用的文本字段:
filter { # 匹配日志结构:前面是可丢弃的文本(日期),后面是JSON内容 # 如果你的日期有固定格式,可替换为更精准的grok模式,比如%{TIMESTAMP_ISO8601} grok { match => { "message" => "%{GREEDYDATA:discard_text}%{JSON:json_payload}" } # 关闭匹配失败的标记(日志格式固定时建议开启,方便排查异常) tag_on_failure => [] } # 将提取到的JSON字符串解析为独立字段 json { source => "json_payload" # 可选:如果希望业务字段统一放在某个命名空间下,可指定target,比如target => "business_data" } # 清理不需要的字段 mutate { remove_field => ["message", "discard_text", "json_payload"] } }
3. 验证与微调
- 如果日志中文本部分(日期)有固定格式,比如
YYYY-MM-DD HH:mm:ss,可以把%{GREEDYDATA:discard_text}替换为%{TIMESTAMP_ISO8601:log_timestamp},后续可选择保留或删除这个时间戳字段。 - 可以用Logstash自带的
logstash-plugin inspect grok工具本地调试grok规则,确保匹配准确。 - 配置完成后重启Logstash,查看Kibana中是否已生成独立的业务字段。
内容的提问来源于stack exchange,提问作者TPS
相关产品推荐
相关产品推荐

