FluentBit配置中绝对路径标签的Wildcard Match失效问题排查
FluentBit字段转换未生效问题排查
问题背景
我们在EKS集群上运行FluentBit代理,使用tail输入采集日志,配置如下:
[INPUT] Name tail Tag kube.* Path /var/log/containers/*.log DB /var/log/containers/log.db multiline.parser cri Skip_Long_Lines Off Refresh_Interval 10 Mem_Buf_Limit 200MB
由于日志要输出到Elastic,需将字段映射为符合Elastic Common Schema的格式。当前error字段为字符串,需转换为error: { message: <value> }的嵌套格式,因此配置了如下过滤器:
# Fix aws-load-balancer-controller logs which output `error` as a string [FILTER] Name modify Match kube./var/log/containers/aws-load-balancer-controller-* Rename error error_message [FILTER] Name nest Match kube./var/log/containers/aws-load-balancer-controller-* Operation nest Wildcard error_message Nest_under error Remove_prefix error_
已确认日志文件存在于该路径,但上述字段转换未生效,请问问题出在哪里?
问题原因及解决方法
1. Match模式匹配错误
FluentBit的Match字段匹配的是Tag值,而非日志文件路径。你的INPUT配置中Tag是kube.*,实际生成的Tag格式为kube.<命名空间>.<Pod名称>.<容器名称>,例如aws-load-balancer-controller的Tag可能是kube.kube-system.aws-load-balancer-controller-xxxxxx.aws-load-balancer-controller,所以原配置里的kube./var/log/containers/aws-load-balancer-controller-*规则完全匹配不到任何日志流。
2. 修正后的过滤器配置
将Match规则改为匹配对应Tag模式,以kube-system命名空间下的控制器为例:
# Fix aws-load-balancer-controller logs which output `error` as a string [FILTER] Name modify Match kube.kube-system.aws-load-balancer-controller-* Rename error error_message [FILTER] Name nest Match kube.kube-system.aws-load-balancer-controller-* Operation nest Wildcard error_message Nest_under error Remove_prefix error_
如果不确定具体Tag格式,可以临时添加stdout输出插件查看实际Tag:
[OUTPUT] Name stdout Match * Format json_lines
3. 额外注意点
- 过滤器顺序正确:modify重命名必须在nest嵌套之前执行,你的配置顺序无需调整。
- 确认
error是独立结构化字段:如果error仅存在于日志文本内容中,需先用parser过滤器将其提取为独立字段,再进行后续转换。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

