应用程序日志的 Grok 过滤器

Grok filter for application logs

在我的应用程序中,我的日志如下-

logFormat: '%-5level [%date{yyyy-MM-dd HH:mm:ss,SSS}] [%X{appReqId}] [%X{AppUserId}] %logger{15}: %m%n'

并且该格式的输出类似于

INFO  [2017-02-03 11:09:21.792372] [b9c0d838-10b3-4495-9915-e64705f02176] [ffe00000000000003ebabeca] r.c.c.f.r.MimeTypeResolver: [Tika MimeType Detection]: filename: 'N/A',  detected mime-type: 'application/msword', time taken: 2 ms

现在我希望日志的每个字段都可以在 kibana 上查询,为此我希望 logstash 解析输入的日志消息,似乎 grok 过滤器可以帮助 us.If grok 过滤器能够过滤我的消息正确输出应该像

"message" => "INFO  [2017-02-03 11:09:21.792372] [b9c0d838-10b3-4495-9915-e64705f02176] [ffe00000000000003ebabeca] r.c.c.f.r.MimeTypeResolver: [Tika MimeType Detection]: filename: 'N/A',  detected mime-type: 'application/msword', time taken: 2 ms",
"appReqId" => "b9c0d838-10b3-4495-9915-e64705f02176",
"timestamp" => "2017-02-03 11:09:21.792372",
"AppUserId" => "ffe00000000000003ebabeca",
"logger" => "r.c.c.f.r.MimeTypeResolver",

我无法弄清楚如何在 logstash.conf 文件中进行配置,以便获得所需的输出。 我试着关注

filter {
 grok {
match => { "message" => "%{LOGLEVEL:severity}* %{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day} %{TIME:time} %{JAVACLASS:class}\.%{JAVAFILE:file}" }
}

}

并在 grok patter varifier 进行了验证,但不会 work.Any 提供帮助。

您可能会发现这样的效果更好:

^%{LOGLEVEL:security}%{SPACE}\[%{TIMESTAMP_ISO8601:timestamp}\]%{SPACE}\[%{DATA:appReqId}\]%{SPACE}\[%{DATA:AppUserId}\]%{SPACE}%{HOSTNAME:logger}:%{DATA:app_message}$

这里的见解是:

  • 使用%{SPACE} 来处理one-or-more space 实例,这可能发生在某些日志格式中。语法中的 * 也可以做到这一点,但这在 grok 表达式中更明确。
  • 使用专用的时间戳格式,%{TIMESTAMP_ISO8601} 而不是试图将其分开并在以后 assemble。这允许稍后使用 date { match => [ "timestamp", ISO8601 ] } filter-block 将其转换为在 Kibana 中有用的真实时间戳。
  • 直接在grok表达式中捕获括号中的属性。
  • 锚定 grok 表达式(^$ 字符)以向正则表达式引擎提供提示,使表达式的处理成本更低。