如何使用Grok解析含嵌套括号与普通格式的日志?
Grok匹配含嵌套括号的线程日志解决方案
针对日志线程部分存在/不存在嵌套括号的解析问题,这里提供适配两种格式的Grok规则:
核心思路
通过自定义匹配模式或通用数据模式,覆盖嵌套小括号()、方括号[]的场景,确保线程字段被完整捕获。
最简可用Grok配置
grok { match => [ "message", "\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{DATA:thread:strip}\] %{LOGLEVEL:log_level}" ] tag_on_failure => ["failed-to-parse"] }
%{DATA}模式会匹配任意非换行字符,能兼容大部分包含嵌套括号的线程字段场景,:strip修饰符会自动去除字段前后的多余空白。
极端场景精准匹配方案
如果%{DATA}在复杂嵌套场景下出现匹配溢出,可以使用自定义模式:
- 创建自定义模式文件(如
custom_patterns),添加以下规则:
THREAD_PATTERN ([^\[\]]|(\([^\)]*\))|(\[[^\]]*\]))+
该规则优先匹配嵌套的小括号、方括号内容,再匹配其他非方括号字符,避免提前终止。
- 引用自定义模式的Grok配置:
grok { patterns_dir => ["/path/to/your/patterns"] # 替换为自定义模式文件所在路径 match => [ "message", "\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{THREAD_PATTERN:thread:strip}\] %{LOGLEVEL:log_level}" ] tag_on_failure => ["failed-to-parse"] }
验证效果
- 日志
[2022-09-05 17:27:24,537] [apps-thread | test-policy] WARN解析后,thread字段值为apps-thread | test-policy - 日志
[2022-09-06 14:19:25,708] [App (app-1) thread #1 - AppsConsumer[apps-notify]] INFO解析后,thread字段值为App (app-1) thread #1 - AppsConsumer[apps-notify]
内容的提问来源于stack exchange,提问作者Lukas123
相关产品推荐
相关产品推荐

