You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:15:41