【问题标题】:How to use grok patterns to match this logs?如何使用 grok 模式来匹配此日志?
【发布时间】:2019-02-05 16:32:59
【问题描述】:

日志内容如下:

[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

第一行记录函数调用信息和执行时间,其他行是正常日志。

现在,我想匹配所有这些,如果行中有 exec 时间,我想匹配它。

我这样写 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,则无法匹配执行时间。

【问题讨论】:

    标签: elasticsearch logstash logstash-grok


    【解决方案1】:

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

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

    【讨论】:

    • 我的模式不能只匹配一个单词,其他测试还可以
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多