Logstash Grok解析MySQL日志异常:PID提取错误求助
修复MySQL日志Grok模式的PID提取错误
我一眼就看出问题出在哪了——你的Grok模式里时间字段和PID字段之间没加空格分隔符,这才导致匹配逻辑乱了套。
问题根源拆解
先看你的原始日志行:
180528 8:46:26 2 Query SELECT 1
再对比你用的Grok模式:
%{NUMBER:date} %{NOTSPACE:time}%{INT:pid}%{GREEDYDATA:message}
日志里8:46:26(时间)和2(PID)之间是有空格的,但你的模式里%{NOTSPACE:time}后面直接跟了%{INT:pid},没有匹配这个空格。Grok的匹配逻辑会尽量满足后续模式的要求,所以它把8:46:2分给了time字段,剩下的6刚好能被%{INT:pid}匹配,真正的PID2就被错误地丢进message里了。
修正方案
只需要在时间和PID的模式之间加个空格就行,最直接的写法是:
%{NUMBER:date} %{NOTSPACE:time} %{INT:pid}%{GREEDYDATA:message}
如果要更严谨(比如日志里可能用制表符分隔),可以用%{SPACE}匹配任意空白字符:
%{NUMBER:date} %{NOTSPACE:time}%{SPACE}%{INT:pid}%{GREEDYDATA:message}
修正后的提取效果
这样调整后,就能得到正确的字段结果:
date:"180528"time:"8:46:26"pid:"2"message:" Query SELECT 1"
要是你觉得message开头的空格看着不舒服,可以再加个%{SPACE}在PID和message之间,或者后续用Logstash的mutate插件去掉message的开头空白。
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

