用于具有任意属性值对的日志的 logstash grok 过滤器

logstash grok filter for logs with arbitrary attribute-value pairs

(这与我的另一个问题logstash grok filter for custom logs有关)

我有一个日志文件,其行如下所示:

14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92
14:46:17.378 [http-nio-8080-exec-3] INFO  METERING - msg=c1ddb068-e6a2-450a-9f8b-7cbc1dbc222a SET_STATUS job=a820018e-7ad7-481a-97b0-bd705c3280ad status=ACTIVE final=false

我构建了一个匹配第一行的模式:

%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}

但显然这只适用于末尾有 data= 的行,而不是第二行末尾有 status=final= 的行,或其他属性值对其他线路?我如何设置一个模式,表示在某个点之后会有任意 foo=bar 对,我想在输出中识别并输出为 attribute/value 对?

您可以像这样更改您的 grok 模式以将所有键值对放在一个字段中 (kvpairs):

%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - %{GREEDYDATA:kvpairs}

之后就可以使用kv filter解析键值对了。

kv {
    source => "kvpairs"
    remove_field => [ "kvpairs" ] # Delete the field afterwards
}

不幸的是,您的 kv 对中有一些简单的值(例如 CREATE_JOB)。您可以使用 grok 解析它们,并对之前的值使用一个 kv 过滤器,对这些简单值之后的值使用另一个 kv 过滤器。