Logstash Grok正则单独可用但组合后失效,求排查帮助
Grok表达式组合后匹配失败的问题排查
问题场景
场景1:单独匹配正常
- 日志字符串:
Tracking : sent request to msgDestination - Grok表达式:
(?<targetMessage>^Tracking : (?:received response from|sent request to) msgDestination$) - 结果:成功将内容捕获到
targetMessage字段
场景2:组合表达式后匹配失败
- 日志字符串:
2022-11-26 8:16:39,873 INFO [task.SomeTask] Tracking : sent request to msgDestination : MODULE1|SERVICE1|20220330051054|TASK1 - Grok表达式:
%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} \[(?<classname>[^\]]+)\] (?<targetMessage>^Tracking : (?:received response from|sent request to) msgDestination$) : %{WORD:moduleName}\|%{WORD:service}\|%{INT:requestId}\|%{WORD:taskName} - 结果:无法匹配目标字符串
错误原因
targetMessage捕获组内的^(行首锚定符)和$(行尾锚定符)是问题核心。场景1中目标字符串本身就是完整一行,锚定符能正常生效;但场景2的完整日志里,Tracking : ... msgDestination只是日志行的中间部分,既不是行首也不是行尾,锚定符强制要求该部分必须占据整行,导致整个表达式匹配失败。
修正方案
移除捕获组内的^和$即可,修正后的Grok表达式如下:
%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} \[(?<classname>[^\]]+)\] (?<targetMessage>Tracking : (?:received response from|sent request to) msgDestination) : %{WORD:moduleName}\|%{WORD:service}\|%{INT:requestId}\|%{WORD:taskName}
内容的提问来源于stack exchange,提问作者bpjoshi
相关产品推荐
相关产品推荐

