应用程序日志的Grok过滤器

时间:2017-02-06 14:21:49

标签: logstash kibana elastic-stack logstash-grok

在我的应用程序中,我按照以下方式登录 -

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过滤器可以帮助我们。如果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验证并且无法正常工作。我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

这里的见解是:

  • 使用%{SPACE}处理一个或多个空间实例,这可能以某些日志格式发生。语法中的*也可以这样做,但这会在grok表达式中更明确地显示它。
  • 使用专用的时间戳格式%{TIMESTAMP_ISO8601},而不是尝试将其分开并稍后进行组合。这允许稍后使用date { match => [ "timestamp", ISO8601 ] }过滤器块将其转换为在Kibana中有用的实时时间戳。
  • 直接在grok表达式中捕获括号中的属性。
  • 锚定grok表达式(^$字符)以提供正则表达式引擎的提示,使表达式处理成本更低。