Fluent-Bit截断Java日志问题及Lua脚本使用咨询
1. 配置首行|符号的作用
这是YAML语法的块标量指示器,用于声明后续的多行文本是一个完整的字符串块,会保留所有换行和缩进格式,专门用来在YAML配置文件中嵌入多行的外部配置(比如这里的Fluent Bit主配置、Lua脚本),避免YAML解析时因换行或空格出现错误。
2. Lua函数调用的位置要求
是的,Lua过滤器必须放在输入(INPUT)与输出(OUTPUT)之间,Fluent Bit会按配置中过滤器的先后顺序依次处理日志。你当前配置里的Lua过滤器位置是正确的(在INPUT之后、Kubernetes过滤器和OUTPUT之前)。
3. Lua脚本未生效的排查与修复
结合你遇到的256KB日志截断丢弃问题,从以下几点排查:
提前截断导致Lua无法捕获完整日志
Fluent Bit的tail输入插件默认Buf_Size为8KB,单条日志超过这个值会被提前截断。需要在所有[INPUT]段添加:Buf_Size 512KB取值需大于你的最大日志尺寸(比如512KB覆盖256KB场景)。
脚本输出未被正确观测
脚本中print()的内容会输出到Fluent Bit自身的容器日志,而非CloudWatch。要验证生效,要么查看Fluent Bit容器日志,要么修改脚本给超大日志添加标记字段:function cb_print(tag, timestamp, record) local log_content = record["log_processed"] or record["log"] if log_content ~= nil then log_size = string.len(log_content) record["log_size"] = log_size if log_size > 255000 then record["is_large_log"] = true end end return 1, timestamp, record end之后在CloudWatch日志中查看是否存在
is_large_log字段。Kubernetes过滤器的字段覆盖问题
你的配置中Kubernetes过滤器开启了Merge_Log On,会将原始log字段合并到log_processed,如果Lua处理的是log字段,后续可能不会被输出到CloudWatch。建议将Lua过滤器调整到Kubernetes过滤器之后,或者按上面的脚本修改为优先处理log_processed字段。ECS环境权限与路径验证
确保ECS任务定义中正确挂载了容器日志目录,且Fluent Bit对storage.path指定的目录有写入权限,避免日志读取或存储失败。
内容的提问来源于stack exchange,提问作者Rob

