构建Grok模式解析多结构日志遇匹配失败问题求助
日志解析Grok模式解决方案
问题分析
三条日志分为两种结构:
- 前两条:时间戳后紧跟日志级别与进程名,整体在一个方括号内
- 第三条:时间戳、进程ID、日志级别分别在独立方括号内
原Grok模式未覆盖这些结构差异,导致匹配失败。
适配的Grok模式
可以使用分支模式匹配两种结构,同时提取timestamp、loglevel、message字段:
# 匹配前两条日志的模式 \[%{TIMESTAMP_ISO8601:timestamp}\:\ %{LOGLEVEL:loglevel}\/%{WORD}\]\s*%{GREEDYDATA:message} | # 匹配第三条日志的模式 \[%{TIMESTAMP_ISO8601:timestamp}\]\s*\[%{INT}\]\s*\[%{LOGLEVEL:loglevel}\]\s*%{GREEDYDATA:message}
也可以用合并的简化模式:
\[%{TIMESTAMP_ISO8601:timestamp}(?: %{INT})?\](?:\:\ %{LOGLEVEL:loglevel}\/%{WORD})?\]?\s*(?:\[%{INT}\]\s*)?(?:\[%{LOGLEVEL:loglevel}\])?\s*%{GREEDYDATA:message}
模式说明
%{TIMESTAMP_ISO8601:timestamp}:兼容两种格式的时间戳(支持带逗号或时区的ISO8601格式)(?:\:\ %{LOGLEVEL:loglevel}\/%{WORD})?:可选匹配前两条日志中时间戳后的:日志级别/进程名部分,?:表示非捕获组,避免生成无用字段(?:\[%{INT}\]\s*)?:可选匹配第三条日志中的进程ID方括号部分(?:\[%{LOGLEVEL:loglevel}\])?:可选匹配第三条日志中的日志级别方括号部分%{GREEDYDATA:message}:匹配剩余的全部消息内容
验证结果
- 第一条日志提取结果:
- timestamp:
2022-10-04 21:45:27,444 - loglevel:
INFO - message:
Events of group {task} enabled by remote
- timestamp:
- 第二条日志提取结果:
- timestamp:
2022-10-04 21:43:06,521 - loglevel:
ERROR - message:
consumer: Cannot connect to redis://10.0.13.57:6379/0: Error 111 connecting to 10.0.13.34:6379. Connection refused..
- timestamp:
- 第三条日志提取结果:
- timestamp:
2022-10-04 21:45:22 +0000 - loglevel:
INFO - message:
Listening at: http://0.0.0.0:8793 (3094)
- timestamp:
内容的提问来源于stack exchange,提问作者Didi
相关产品推荐
相关产品推荐

