Fluent Bit仅*匹配生效问题排查及日志路由配置调整求助
问题分析与解决方案
核心需求:CloudWatch输出过滤含unwatedtext的日志,S3输出保留全部日志;当前核心问题是Fluent Bit中除*外的Match规则不生效,根源在于你混淆了Fluent Bit路由tag和日志记录内的字段,同时配置语法存在错误。
现有配置的核心错误
- Lua脚本中修改的是日志记录内的
tag字段,而非Fluent Bit用于路由的全局tag,后续Match规则无法识别这个字段。 - 过滤器的Match语法错误(比如
Match $tag cw),Fluent Bit的Match参数仅匹配路由tag,不支持直接匹配记录内的字段。 rewrite_tag过滤器配置逻辑错误,未基于正确的路由tag或字段进行规则匹配。
正确配置方案
修正后的Lua脚本(append_tag.lua)
直接为复制出的两条日志设置不同的路由tag,而非修改记录内字段:
function process_record(tag, timestamp, record) -- 复制原始日志,生成两条记录并分别指定路由tag return 2, timestamp, { {record, "s3_log"}, -- 这条路由到S3,保留全部日志 {record, "cw_log"} -- 这条路由到CloudWatch,后续做过滤处理 } end
完整Fluent Bit配置文件
[SERVICE] flush 1 daemon off log_level debug # 输入模块(log_router默认的ecs_logs输入,指定明确的路由tag) [INPUT] Name ecs_logs Tag raw_logs # Lua过滤器:拆分日志为S3和CloudWatch两个路由分支 [FILTER] Name lua Match raw_logs script /append_tag.lua call process_record # 仅对CloudWatch分支的日志应用grep过滤,移除含unwatedtext的记录 [FILTER] Name grep Match cw_log Exclude log unwatedtext # 仅对CloudWatch分支的日志应用modify过滤,删除冗余字段(按需调整字段名) [FILTER] Name modify Match cw_log Remove redundant_field1 Remove redundant_field2 # S3输出:匹配s3_log路由,保留全部原始日志 [OUTPUT] Name s3 Match s3_log bucket your-s3-bucket-name region af-south-1 s3_key_format /ecs/logs/%Y/%m/%d/%H/%M/%S.log log_key log auto_create_bucket On # CloudWatch输出:匹配cw_log路由,仅输出过滤后的日志 [OUTPUT] Name cloudwatch_logs Match cw_log log_key log region af-south-1 log_group_name /ecs/log log_stream_prefix fluent-bit- auto_create_group On log_format json/emf
关键修正说明
- 路由tag精准控制:通过Lua脚本直接为每条复制的日志分配独立路由tag,后续过滤器和输出模块可以精准匹配对应分支,避免全局
*导致的范围污染。 - 过滤逻辑隔离:grep和modify过滤器仅作用于
cw_log路由的日志,完全不影响S3分支的原始日志。 - 输入tag明确化:为INPUT设置明确的
raw_logstag,避免用*导致逻辑混乱,让整个路由流程更清晰。
验证方式
- 查看Fluent Bit的debug日志,确认日志被拆分为
s3_log和cw_log两个路由tag。 - 检查CloudWatch Logs中是否无
unwatedtext相关日志,S3桶中是否保留了所有原始日志。
内容的提问来源于stack exchange,提问作者Umair
相关产品推荐
相关产品推荐

