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

如何使用Fluent Bit解析K8s中.NET容器的CRI/JSON格式日志

问题:Fluent Bit无法解析.NET容器的JSON日志并合并到根节点

我正在运行Fluent Bit v3.2.10,用于解析本地Kubernetes集群中.NET容器的日志。.NET容器通过ESC-formatter返回JSON格式的日志,但Fluent Bit未能合并日志,而是将整个JSON日志作为字符串内容添加到log属性下,样例日志如下:

{"_index": "mylogs-2025.05.04","_id": "CjKFmpYBJ--8fYq5BQtc","_version": 1,"_score": 0,"_ignored": ["log.keyword"],"_source": {"@timestamp": "2025-05-04T08:58:49.406Z","stream": "stdout","flag": "F","log": "{\"@timestamp\":\"2025-05-04T08:58:49.4056786+00:00\",\"log.level\":\"Information\",\"message\":\"Request starting \"HTTP/1.1\" \"POST\"\"}"}}

原本期望Merge_Log On能将解析器生成的结构化日志合并到最终JSON中,但它仍将日志保留为字符串,推测日志在到达kubernetes过滤器前未正确从字符串解码为JSON。

当前使用的解析器配置:

[PARSER]
  Name ecs_cri
  Format regex
  Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<flag>[FP]) (?<log>.*)
  Time_Key time
  Time_Format %Y-%m-%dT%H:%M:%S.%L%z
  Decode_Field_As escaped_utf8 log do_next
  Decode_Field_As json log

[PARSER]
  Name ecs_json
  Format json
  Time_Keep On
  Decode_Field_As json log

输入和过滤器配置:

[INPUT]
  Name tail
  Path /var/log/containers/*.log
  Parser ecs_cri
  Tag kube.*
  Mem_Buf_Limit 5MB
  Skip_Long_Lines Off

[FILTER]
  Name parser
  Match kube.*
  Key_Name log
  Parser ecs_json

[FILTER]
  Name kubernetes
  Match kube.*
  Merge_Log On
  Keep_Log On
  K8S-Logging.Parser On
  K8S-Logging.Exclude Off

问题根源

配置存在重复解析和顺序问题:

  1. ecs_cri解析器已尝试对log字段做转义解码和JSON解析,但冗余的后续parser过滤器可能干扰了解析结果;
  2. kubernetes过滤器的Merge_Log需要log字段是结构化JSON,而非字符串,当前流程未确保这一点。

修正后的配置

1. 简化解析器配置

删除冗余的ecs_json解析器,优化ecs_cri解析器:

[PARSER]
  Name ecs_cri
  Format regex
  Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<flag>[FP]) (?<log>.*)
  Time_Key time
  Time_Format %Y-%m-%dT%H:%M:%S.%L%z
  # 先解码转义字符,再解析JSON,确保嵌套JSON被正确识别
  Decode_Field_As escaped_utf8 log do_next
  Decode_Field_As json log
  # 保留日志自带的时间字段,避免被覆盖
  Time_Keep On

2. 调整过滤器流程

移除多余的parser过滤器,确保kubernetes过滤器处理时log已转为结构化数据:

[INPUT]
  Name tail
  Path /var/log/containers/*.log
  Parser ecs_cri
  Tag kube.*
  Mem_Buf_Limit 5MB
  Skip_Long_Lines Off

[FILTER]
  Name kubernetes
  Match kube.*
  Merge_Log On
  # 不需要保留原始log字符串字段的话设为Off,需要则保持On
  Keep_Log Off
  K8S-Logging.Parser On
  K8S-Logging.Exclude Off

关键说明

  • Decode_Field_As escaped_utf8 log do_next先把日志中的转义字符(比如\")还原为正常格式,再执行JSON解析,确保嵌套的JSON结构被正确解析;
  • 去掉重复的parser过滤器,避免二次解析导致的字段覆盖或解析失败;
  • Keep_Log Off可以清理最终输出中的原始log字符串,让结构化字段直接出现在根节点。

内容的提问来源于stack exchange,提问作者Hejle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:31:03