Fluent Bit无法在CloudWatch创建部分日志流及仅发送单个日志流问题求助
问题描述
我遇到了Fluent Bit的异常情况:它只发送第一个日志流(Nginx ingress的日志)到CloudWatch,其他配置的日志流(比如MySQL Stage、WordPress Test/Stage)都没有被创建或发送。我的配置文件如下,且所有日志组已经提前创建完成。
从Fluent Bit的Pod日志可以看到,所有Input都已初始化并监听了对应的日志文件,所有Output Worker也都启动了,但只有Nginx的日志流被成功创建,其他日志流没有任何创建或发送的日志记录。
我的配置文件
Inputs 配置
[INPUT] Name tail Path /var/log/containers/ingress-nginx-controller*.log multiline.parser docker, cri Tag kube.* Mem_Buf_Limit 5MB Skip_Long_Lines On [INPUT] Name tail Path /var/log/containers/wordpress-test*.log exclude_path kube.var.log.containers.wordpress-test-stage*.log multiline.parser docker, cri Tag kube.* Mem_Buf_Limit 5MB Skip_Long_Lines On [INPUT] Name tail Path /var/log/containers/wordpress-test-stage*.log multiline.parser docker, cri Tag kube.* Mem_Buf_Limit 5MB Skip_Long_Lines On [INPUT] Name tail Path /var/log/containers/mysql-stage*.log multiline.parser docker, cri Tag kube.* Mem_Buf_Limit 5MB Skip_Long_Lines On [INPUT] Name systemd Tag host.* Systemd_Filter _SYSTEMD_UNIT=kubelet.service Read_From_Tail On
Outputs 配置
[OUTPUT] Name cloudwatch_logs Match kube.var.log.containers.ingress-nginx-controller* region eu-west-1 log_group_name beyer-eks/nginx-access-logs log_stream_prefix nginx_ingress_ auto_create_group true [OUTPUT] Name cloudwatch_logs Match kube.var.log.containers.mysql-stage* region eu-west-1 log_group_name beyer-eks/mysql-stage-logs log_stream_name mysql_stage_ auto_create_group true [OUTPUT] Name cloudwatch_logs Match_Regex kube.var.log.containers.wordpress-test(?!-stage)* region eu-west-1 log_group_name beyer-eks/wordpress-test-logs log_stream_name wordpress_test_ auto_create_group true [OUTPUT] Name cloudwatch_logs Match kube.var.log.containers.wordpress-test-stage* region eu-west-1 log_group_name beyer-eks/wordpress-test-stage-logs log_stream_name wordpress_test_stage_ auto_create_group true
Service 配置
[SERVICE] Flush 10
排查方向与解决方案
我帮你梳理了几个可能导致问题的关键点,你可以逐一验证:
Input的
exclude_path配置错误
你第二个tail Input的exclude_path写的是kube.var.log.containers.wordpress-test-stage*.log,但exclude_path参数需要填写文件路径格式(比如/var/log/containers/wordpress-test-stage*.log),而不是Tag格式。这个错误导致该Input仍然会监听WordPress Stage的日志文件,和第三个Input重复监听同一文件,可能引发日志处理冲突。- 修复:把第二个Input的
exclude_path改为/var/log/containers/wordpress-test-stage*.log
- 修复:把第二个Input的
WordPress Test的
Match_Regex正则表达式有误
你当前的正则kube.var.log.containers.wordpress-test(?!-stage)*存在两个问题:- 正则中的
.需要转义(.在正则中代表任意字符),应该写成\. (?!-stage)是负向预查,但后面的*位置错误,应该用.*匹配剩余的Tag内容- 修复后的正则应为:
kube\.var\.log\.containers\.wordpress-test(?!-stage).*
- 正则中的
log_stream_namevslog_stream_prefix的使用差异
你给Nginx用的是log_stream_prefix(会自动生成带文件名后缀的唯一日志流),但其他Output用的是log_stream_name——这个参数会把所有日志都发送到同一个固定名称的日志流,如果没有日志流入,CloudWatch不会自动创建这个日志流。- 建议:把其他Output的
log_stream_name改成log_stream_prefix,和Nginx的配置保持一致,这样会自动根据日志来源生成唯一的日志流,更容易排查是否有日志到达Output。
- 建议:把其他Output的
验证Tag是否正确匹配
可以临时添加一个stdout Output来验证所有日志的Tag是否符合预期:[OUTPUT] Name stdout Match * Format json_lines启动Fluent Bit后查看Pod日志,确认MySQL、WordPress的日志Tag是否和你Output中
Match/Match_Regex的规则一致。如果Tag不匹配,日志就不会被发送到对应的CloudWatch Output。
备注:内容来源于stack exchange,提问作者monsterkekso

