如何在Grok解析日志时同时提取完整JSON Body及指定字段
解决方案
步骤1:处理原始body字段(若包含前缀)
当前自定义BODY模式解析出的body字段会带有Body:前缀(比如Body: {"status":200,...}),需要先去掉前缀得到纯JSON字符串:
mutate { gsub => ["body", "^Body: ", ""] }
如果希望Grok直接捕获纯JSON,可修改自定义BODY模式:
BODY (Body: %{DATA:body})
步骤2:解析JSON并提取目标字段
使用json过滤器解析纯JSON字符串,同时提取指定字段到parsedFromBody,保留原始body字段:
方式1:直接提取(解析后的JSON字段会混入根文档)
json { source => "body" add_field => { "parsedFromBody" => "%{[fieldToBeParsed]}" } }
方式2:用临时对象隔离解析结果(避免根文档字段混乱)
json { source => "body" target => "temp_parsed" # 把解析后的JSON放到临时对象里 } mutate { add_field => { "parsedFromBody" => "%{[temp_parsed][fieldToBeParsed]}" } # 可选:如果不需要临时对象,可移除 # remove_field => ["temp_parsed"] }
完整配置示例
filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}%{SPACE}*%{LOGLEVEL:level}:%{SPACE}*%{DATA}%{BODY:body}" } patterns_dir => ["/path/to/your/custom-patterns"] # 指向存放自定义BODY模式的目录 } # 移除Body:前缀 mutate { gsub => ["body", "^Body: ", ""] } # 解析JSON并提取目标字段 json { source => "body" add_field => { "parsedFromBody" => "%{[fieldToBeParsed]}" } } }
最终解析结果
处理后的数据会包含以下字段:
timestamp:Grok提取的时间戳level:Grok提取的日志级别body:完整的原始JSON字符串parsedFromBody:从JSON中提取的fieldToBeParsed数值
内容的提问来源于stack exchange,提问作者skywalker
相关产品推荐
相关产品推荐

