如何使用grok模式匹配此日志?

时间:2018-07-11 07:07:08

标签: elasticsearch logstash logstash-grok

这样的日志内容:

[2018-07-09 11:30:59] [13968] [INFO] [1e74b6b7-fcb2-4dde-a259-7db1de0350ea] run entry() 11ms
[2018-07-09 11:30:59] [13968] [INFO] [1e74b6b7-fcb2-4dde-a259-7db1de0350ea] entry done

第一行记录了带有执行时间的函数调用信息,另一行是正常记录。

现在,我想匹配所有这些对象,并且如果行中有执行时间,我想匹配它。

我写这样的grok模式:

\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{NUMBER:process_id}\] \[%{LOGLEVEL:loglevel}\] \[%{UUID:request_id}\] %{DATA:message}(\s%{NUMBER:use_time}ms)?

它不起作用。匹配结果为:

{
  "process_id": "13968",
  "loglevel": "INFO",
  "message": "",
  "request_id": "1e74b6b7-fcb2-4dde-a259-7db1de0350ea",
  "timestamp": "2018-07-09 11:30:59"
}

如果将DATA:message更改为GREEDYDATA:message,则无法匹配执行时间。

1 个答案:

答案 0 :(得分:0)

我通过使用原始正则表达式替换总消息字段来解决它:

\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{NUMBER:process_id}\] \[%{LOGLEVEL:loglevel}\] \[%{UUID:request_id}\] (?<message>.+ (?:(?<use_time>\d+(?:\.\d+)?)ms)?.*)