如何编写适配两类日志的GROK表达式并捕获context字段?
解决GROK表达式匹配两类日志的问题
问题原因
你原来的GROK表达式中,末尾的[\s]?{%{GREEDYDATA:context}}是强制匹配规则,但第二行日志没有大括号包裹的context内容,导致匹配失败。同时,%{GREEDYDATA:message}会匹配到行尾,即便第一行也会把context部分包含进message字段,不符合需求。
调整后的GROK表达式
\[%{TIMESTAMP_ISO8601:log_timestamp}\] %{WORD:app_environment}.%{LOGLEVEL:log_level}: %{DATA:message}(?:\s+{%{GREEDYDATA:context}})?
关键调整说明
- 将
%{GREEDYDATA:message}替换为%{DATA:message}:DATA会匹配除换行外的任意字符,但不会一直占用到行尾,给后续可选的context部分留出匹配空间。 - 用
(?:\s+{%{GREEDYDATA:context}})?定义可选匹配组:(?:...)是非捕获组,避免额外生成无用字段;\s+匹配message与context之间的一个或多个空格;?标记整个组为可选,既适配带context的日志行,也适配不带context的日志行。
匹配效果
- 第一行日志:
message字段捕获Creating fake logs for testing purposes,context字段捕获"hostname":"my-host-6f5blah599-9p9kb","ip":"190.168.19.251","performance":29.680236 - 第二行日志:
message字段捕获Creating simple fake logs for testing purposes,context字段无值(或为null)
内容的提问来源于stack exchange,提问作者Akshay Lokur
相关产品推荐
相关产品推荐

