多模式日志场景下如何用grok提取status值并配置ingest pipeline
解决方案
你不需要编写匹配全量日志结构的grok pattern,只需要定位到status:片段做局部提取即可,grok支持只捕获目标内容,忽略日志其他部分的格式差异。
1. 核心grok pattern
直接使用如下pattern即可适配绝大多数结构不统一的日志,只要日志中包含status:数字的格式就能精准提取:
%{DATA}status:%{INT:status}%{DATA}
%{DATA}会匹配任意非换行的字符,自动忽略status前后的所有其他字段内容,不需要关注日志其他部分的结构差异%{INT:status}会将status:后的整数提取为名为status的字段,类型为整数
2. 完整ingest pipeline配置示例
{ "processors": [ { "grok": { "field": "message", "patterns": [ "%{DATA}status:%{INT:status}%{DATA}" ], "ignore_failure": true } }, { "set": { "field": "status_code", "value": "successful", "if": "ctx?.status == 200" } }, { "set": { "field": "status_code", "value": "failed", "if": "ctx?.status in [502, 404, 402]" } } ] }
3. 特殊场景适配
如果部分日志里的status字段带引号,比如"status":"200"的格式,只需要在patterns数组里多补一个兼容规则即可,grok会按顺序匹配,命中第一个规则就会停止:
"patterns": [ "%{DATA}\"status\":\"%{INT:status}\"%{DATA}", "%{DATA}status:%{INT:status}%{DATA}" ]
如果担心误匹配类似xx_status:的字段,可以调整pattern为%{DATA}[^a-zA-Z0-9_]status:%{INT:status}%{DATA},确保status前面没有其他字段名前缀。
内容的提问来源于stack exchange,提问作者sidharth vijayakumar
相关产品推荐
相关产品推荐

