如何通过Fluentd配置扁平化嵌套JSON格式的容器日志?
可以通过Fluentd配置实现该需求
你需要通过多层JSON解析和字段扁平化两个步骤处理这类嵌套转义的日志,以下是具体实现方案:
步骤1:解析log字段中的转义JSON
使用parser插件将字符串类型的log字段解析为结构化嵌套JSON,同时保留原有的time字段:
<filter **> @type parser key_name log reserve_data true remove_key_name_field true <parse> @type json </parse> </filter>
执行后日志结构变为:
{ "time": "time_val", "field1": "value1", "field2": "value2", "field3": "{\"nested_field1\": \"value1\",\"nested_field2\": \"value2\",\"nested_field3\": \"value3\"}" }
步骤2:解析field3字段中的转义JSON
再次使用parser插件解析field3字段,完成最终扁平化:
<filter **> @type parser key_name field3 reserve_data true remove_key_name_field true <parse> @type json </parse> </filter>
此时日志会变成你需要的目标格式:
{ "time": "time_val", "field1": "value1", "field2": "value2", "nested_field1": "value1", "nested_field2": "value2", "nested_field3": "value3" }
完整配置示例
将上述逻辑整合到完整的Fluentd配置中:
<source> # 替换为你的容器日志采集配置(如docker/containerd) @type docker tag docker.* <parse> @type json # 先解析外层容器日志的JSON结构 </parse> </source> <filter docker.**> @type parser key_name log reserve_data true remove_key_name_field true <parse> @type json </parse> </filter> <filter docker.**> @type parser key_name field3 reserve_data true remove_key_name_field true <parse> @type json </parse> </filter> <match docker.**> # 替换为你的输出配置(如elasticsearch/stdout) @type stdout </match>
注意事项
- 若
field3存在特殊转义格式,可在parser插件中启用unescape_strings参数适配 - 针对更复杂的多层嵌套场景,可重复使用
parser插件逐层解析,或结合record_transformer插件的flatten指令灵活处理字段
内容的提问来源于stack exchange,提问作者Ohad
相关产品推荐
相关产品推荐

