GROK 中的日志级别模式

Loglevel pattern in GROK

我是 logstash 和 grok 的新手,对模式有疑问。 我正在尝试为我的 apache 错误日志创建一个 grok 模式。 但是我对以下行为有点困惑。

如果我在 http://grokdebug.herokuapp.com/ 中使用基础匹配:

%{LOGLEVEL:severity%{IPV4:clientip}%{GREEDYDATA:errormsg}

我在以下日志片段中发现不匹配:

[Sun Apr 10 09:28:01 2016] [error] [client 111.11.111.111] File does not exist: /var/www/html/favicon.ico

现在,如果我 运行 %{LOGLEVEL:severity} 或 %{IPV4:clientip}%{GREEDYDATA:errormsg} 分开,所有模式都有效。但如果我一起尝试,我会得到 "no match" return.

我认为发生这种情况是因为 %{LOGLEVEL:severity} t运行涵盖了日志的其余部分,但我不明白为什么。

有人对我做错了什么有什么建议吗?

提前致谢。

与所有未锚定的正则表达式一样,一旦开始匹配,就需要匹配字符串中的所有内容。在您的模式中,您没有考虑样本中存在的空格或括号。 (这还假设 "severity" 后缺少 } 是复制和粘贴错误)。

您编写的 grok 模式确实与日志消息不匹配,您为什么不尝试使用比 grok 过滤器更高效的 dissect {}

您的留言是:

[Sun Apr 10 09:28:01 2016] [error] [client 111.11.111.111] File does not exist: /var/www/html/favicon.ico

因此您可以编写一个 dissect 过滤器,例如:

dissect {
  mapping => {
    "message" => "[%{raw_date}] [%{loglevel}] [client %{client_ip}] %{log_message}"
  }
}