我的服务器上有以下格式的日志,开始将日志注入我的ELK服务器,并且卡在匹配日志模式中。
2018-04-20T21:51:13.677291071-0400 level=7 [Common] [Common] [ID=22] [0001232700011fde] [00943 01248] [Thread1] "[key1:N/A key2:0 key3:N/A]: Completed flow"
我能够匹配Thread1
,如何获得双引号内key1
的值。
目前我使用下面的模式并将整个消息存储在单个字符串中。
%{TIMESTAMP_ISO8601:logTimestamp} level=%{NUMBER:severity} \[Common\] \[Common] \[ID=%{BASE10NUM:logId}] \[%{WORD:taskId1}] \[%{DATA:taskId2}] \[%{DATA:taskName}]%{GREEDYDATA:logString}
我使用http://grokdebug.herokuapp.com/来检查语法,是否有其他免费实用程序根据输入字符串提供grok模式?
答案 0 :(得分:0)
您可以简单地在grok
模式之外指定双引号,如下所示,
"\[key1:%{DATA:key1}
这也会匹配key1
,
%{TIMESTAMP_ISO8601:logTimestamp} level=%{NUMBER:severity} \[Common\] \[Common] \[ID=%{BASE10NUM:logId}] \[%{WORD:taskId1}] \[%{DATA:taskId2}] \[%{DATA:taskName}] "\[key1:%{DATA:key1}
上述方法的问题在于,由于正斜杠,它不会与N/A
匹配。如果/
为key1
并且还接受该字段的其他字符,则更好的方法是从key
值中写custom pattern以逃避N/A
,
"\[key1:(?<key1>(N\/A|\w+))
<{1}}的完整模式将是
key1
它会产生以下输出,
%{TIMESTAMP_ISO8601:logTimestamp} level=%{NUMBER:severity} \[Common\] \[Common] \[ID=%{BASE10NUM:logId}] \[%{WORD:taskId1}] \[%{DATA:taskId2}] \[%{DATA:taskName}] "\[key1:(?<key1>(N\/A|\w+))
希望这会有所帮助。