如何使用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
问题根源
配置存在重复解析和顺序问题:
ecs_cri解析器已尝试对log字段做转义解码和JSON解析,但冗余的后续parser过滤器可能干扰了解析结果;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
相关产品推荐
相关产品推荐

