乐闻世界logo
搜索文章和话题

How to handle non-matching Logstash grok filters

3 个月前提问
3 个月前修改
浏览次数7

1个答案

1

在处理Logstash中不匹配的grok过滤器时,通常需要进行以下几个步骤:

1. 识别问题

首先,识别具体哪个部分的grok模式没有正确匹配日志。这可以通过查看Logstash的日志文件来实现,特别是关注带有 _grokparsefailure 标签的记录。

2. 检查和调整grok模式

检查当前的grok表达式,并与产生错误的日志样本进行对比。这一步很关键,因为可能是正则表达式没有正确匹配日志格式的细节。可以使用Kibana的Grok Debugger工具或在线的Grok Debugger来测试和修改你的grok模式。例如,如果原始日志是这样的:

shell
123.123.123.123 - - [12/Dec/2020:12:34:56 +0000] "GET /index.html HTTP/1.1" 200 3456

而你的grok模式是:

shell
%{IP:client} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} %{NUMBER:response}

你需要确保每个部分都能正确匹配。

3. 使用多个模式

有时,日志格式可能因来源不同而有所不同。在这种情况下,可以使用多个grok模式尝试匹配。使用grok插件的match配置项可以列出多个模式,Logstash会按顺序尝试每个模式直到成功匹配为止。例如:

plaintext
grok { match => { "message" => [ "%{IP:client} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} %{NUMBER:response}", "%{IP:client} %{USER:ident} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} %{NUMBER:response}" ]} }

4. 调试和验证

在调整grok表达式之后,重要的是验证新的模式是否正确无误。可以通过将日志样本送入修改后的Logstash配置并观察输出来完成验证。确保没有出现 _grokparsefailure 的标签。

5. 优化性能

如果你的grok模式过于复杂或者尝试匹配的模式过多,可能会影响Logstash的处理性能。评估是否可以简化grok模式或者预处理日志以减轻grok的负担。

示例

假设你有一个非标准的日志格式和相应的grok模式不匹配问题。通过上述步骤,你调整了grok模式,使用Grok Debugger验证,并通过逐步简化表达式来优化性能,最终确保所有日志都能被正确解析,同时保持了较高的处理效率。

这种有条不紊、逐步解决问题的方法,不仅能有效应对日常的日志处理问题,还能在处理突发的日志格式变更时,迅速定位并解决问题,保证日志系统的稳定运行。

2024年8月16日 21:02 回复

你的答案