在 logstash 上使用 grok 过滤器解析数据

Parsing data with grok filter on logstash

我在 logstash 上使用 grok 过滤器时遇到问题。 我有这个日志:

83.149.9.216 - - [04/Jan/2015:05:13:42 +0000]

我想解析IP和日期。 我有下面的代码,但没有找到匹配项。

^%{IPV4:req_id} - - \[(?<date>%{DAY}/%{MONTH}/%{YEAR}:%{HOUR}:%{MINUTE}:%{SECOND} +0000)]

我做错了什么? 谢谢!

您应该将 %{DAY}(= 名称的日期)更改为 %{MONTHDAY}(以匹配 数字) 并转义 + 以将其匹配为文字 + char:

^%{IPV4:req_id} - - \[(?<date>%{MONTHDAY}/%{MONTH}/%{YEAR}:%{HOUR}:%{MINUTE}:%{SECOND} \+0000)]
                              ^^^^^^^^^^^                                              ^

Calvin Taylor 所建议,您可以进一步增强模式以匹配任何带有 %{ISO8601_TIMEZONE} 而不是 \+0000:

的 ISO8601 时区
^%{IPV4:req_id} - - \[(?<date>%{MONTHDAY}/%{MONTH}/%{YEAR}:%{HOUR}:%{MINUTE}:%{SECOND} %{ISO8601_TIMEZONE})]
                                                                                       ^^^^^^^^^^^^^^^^^^^

参见Grok patterns

MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])
DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?)