如何在Fluent Bit中将转义的JSON字符串解析为JSON对象并写入指定字段
如何在Fluent Bit中将转义的JSON字符串解析为JSON对象并写入指定字段
问题场景
你现在的需求很明确:Fluent Bit通过forward输入接收的日志里,log字段是一个转义后的JSON字符串,需要把它解析成结构化的JSON对象,统一放到log_processed字段中,同时保留原日志里的app、date、workload等顶级字段不变。
原配置的问题分析
你的现有配置逻辑有点绕,核心问题出在nest过滤器的使用上:
- 第二个
nest用了wildcard: '*',会把**所有顶级字段(包括你想保留的app、date等)**都塞进log_processed,之后又用lift把部分字段拉回顶级,不仅操作冗余,还容易因字段处理顺序导致格式错误(比如你示例里upstreamCacheStatus出现的多余转义问题)。 - 没有精准定位到「只把解析后的log结构化字段」移动到
log_processed,而是对所有字段执行了嵌套操作。
修正后的完整配置
--- service: flush: 1 log_level: warn http_server: true http_listen: 0.0.0.0 http_port: 2020 hot_reload: on log_File: /var/log/fluent-bit/fluent-bit.log parsers_file: /fluent-bit/etc/parsers.conf pipeline: inputs: - name: forward tag: docker listen: 0.0.0.0 port: 24224 filters: # 第一步:解析log字段中的转义JSON字符串,转为结构化键值对 - name: parser match: 'docker' parser: json key_name: log preserve_key: true # 保留原log字段(不需要的话可设为false) reserve_data: true # 确保原日志的顶级字段(app、date等)不被删除 # 第二步:把解析出来的结构化字段统一嵌套到log_processed下 - name: nest match: "docker" operation: nest exclude: "app,date,workload,container_id,container_name,source,log" # 排除要保留在顶级的字段 nest_under: log_processed outputs: - name: stdout match: '*' format: json_lines
配置逐段解释
Parser 过滤器
key_name: log:明确指定要解析的目标字段是那个存了转义JSON的log字段parser: json:用Fluent Bit内置的json解析器处理该字段preserve_key: true:解析后保留原始的log字段(如果不需要存原始转义字符串,直接改成false即可)reserve_data: true:保证原日志里的app、date等字段不会被覆盖或丢失
Nest 过滤器
operation: nest:执行嵌套操作,把指定字段放到父字段下exclude: ...:明确列出哪些字段不要嵌套,也就是要留在顶级的字段nest_under: log_processed:把除了排除列表之外的所有字段(也就是从log解析出来的结构化数据),统一放到log_processed这个父字段中
最终效果
处理后的日志完全符合你的预期:
app、date、workload等原始顶级字段保留在根层级- 从
log解析出来的所有结构化数据,会整齐地被收纳到log_processed字段中,不会出现多余转义或格式错误
可选优化
如果不需要保留原始的log字段,直接把parser中的preserve_key设为false,这样日志会更简洁,只保留解析后的结构化数据和必要的顶级字段。




