Logstash Pipeline的Grok模式仅识别Java日志DEBUG级别问题
问题根因
你遇到的匹配失败问题核心是不同长度的日志级别后缀的空白字符数量不一致:
DEBUG是5个字符,INFO是4个字符,WARN是4个,ERROR是5个,日志输出时为了字段对齐会给短级别的后缀多补1个空格,你当前的Grok规则中%{LOGLEVEL:level}后只写了单个固定空格,只能匹配刚好带1个后缀空格的DEBUG级别,INFO等短级别因为后缀有2个空格,匹配失败。
Kibana Grok Debugger测试正常是因为大部分场景下粘贴日志时连续空格会被自动折叠,或是Debugger前端默认折叠空白展示,掩盖了原始日志的空白数量差异。
修复方案
- 将Grok规则中所有固定单个空格替换为
\s+,可以匹配1个及以上任意空白字符,兼容不同数量的空格、制表符场景 - 可选:新增
tag_on_failure配置,给解析失败的日志打标方便后续排查 - 可选:如果需要完全剔除原始带时间戳的
message字段,新增mutate过滤器删除对应字段 - 可选:如果需要将日志自带的时间戳替换为Logstash的默认时间字段
@timestamp,可新增date过滤器处理
修改后的完整filter配置参考:
filter { grok { match => [ "message", "%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:level}\s+(?<logmessage>.*)" ] add_tag => [ "java" ] tag_on_failure => ["_grok_parse_fail"] } # 可选:将日志时间同步到@timestamp date { match => ["timestamp", "yyyy-MM-dd HH:mm:ss.SSS"] target => "@timestamp" remove_field => ["timestamp"] } # 可选:删除原始带时间戳的message字段 # mutate { # remove_field => ["message"] # } }
验证方法
修改配置重启Logstash后,检查INFO级别日志是否正常打上java标签,level、logmessage字段提取正常,无_grok_parse_fail标签即可。
内容的提问来源于stack exchange,提问作者alparius
相关产品推荐
相关产品推荐

