应用程序日志的 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 表达式(
^
和 $
字符)以向正则表达式引擎提供提示,使表达式的处理成本更低。
在我的应用程序中,我的日志如下-
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 表达式(
^
和$
字符)以向正则表达式引擎提供提示,使表达式的处理成本更低。