Fluentd 如何解析嵌套 JSON 字段?

Fluentd 解析嵌套 JSON 的两步:parser 先用 json 解析器解析整条日志,字符串类型的内嵌 JSON 字段再用 filter 阶段的 json 解析器二次展开。本文给出完整配置与 record_accessor 点路径用法。

最佳实践
Fluentd 如何解析嵌套 JSON 字段?封面

两层处理:第一层 <parse> @type json </parse> 解析日志本体;如果某个字段的值还是 JSON 字符串(如 request_body),第二层在 filter 里再对该字段执行一次 JSON 解析,嵌套对象就被展开了。

完整配置

<source>
  @type tail
  path /var/log/app/*.log
  tag app.json
  <parse>
    @type json          # 第一层:整行是 JSON
  </parse>
</source>

<filter app.json>
  @type parser
  key_name request_body  # 第二层:该字段的值是 JSON 字符串
  reserve_data true
  <parse>
    @type json
  </parse>
</filter>

原始日志:

{"level":"INFO","request_body":"{\"order_id\":123,\"amount\":99.5}"}

解析后 order_idamount 成为顶层可检索字段。

访问深层字段

配 record_accessor 插件后,点路径直达嵌套字段:

<filter app.json>
  @type record_transformer
  <record>
    user_city ${record["user"]["profile"]["city"]}
  </record>
</filter>

观测云对照

观测云 DataKit Pipeline 的 JSON 解析天然递归——json() 函数把 JSON 字符串字段整体展开为结构,多级嵌套一次到位,无需多层 filter 串联。

常见问题(FAQ)

Q:字段值有时不是 JSON 会报错吗? parser filter 默认跳过解析失败的记录并保留原文(reserve_data),日志会带 parse error 标记。

Q:数组怎么展开? record_accessor 支持 [0] 下标;要把数组元素拆成多条事件需要用专门插件。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台