Fluentd 如何解析嵌套 JSON 字段?
Fluentd 解析嵌套 JSON 的两步:parser 先用 json 解析器解析整条日志,字符串类型的内嵌 JSON 字段再用 filter 阶段的 json 解析器二次展开。本文给出完整配置与 record_accessor 点路径用法。
两层处理:第一层 <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_id、amount 成为顶层可检索字段。
访问深层字段
配 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] 下标;要把数组元素拆成多条事件需要用专门插件。