Fluent Bit 中如何截断超长的日志消息?
Fluent Bit 截断超长日志最灵活的方式是用 Lua filter 写脚本按长度截断字段。本文给出 truncate.lua 示例和 Fluent Bit 配置,以及观测云 Pipeline 的等价做法。
最通用的做法:写一个 Lua 脚本(如 truncate.lua)检查目标字段长度,超长则截断,然后在 Fluent Bit 配置中通过 Lua filter 挂载该脚本。
完整配置
Lua 脚本 truncate.lua:
function truncate_msg(tag, timestamp, record)
local max_length = 1000
if record.msg and string.len(record.msg) > max_length then
record.msg = string.sub(record.msg, 1, max_length) .. "...[truncated]"
end
return 1, timestamp, record
end
Fluent Bit 配置:
[INPUT]
Name tail
Path /var/log/myapp/*.log
Tag myapp.*
[FILTER]
Name lua
Match myapp.*
script /etc/fluent-bit/truncate.lua
call truncate_msg
[OUTPUT]
Name stdout
Match myapp.*
Lua filter 的返回约定:1 表示修改了记录,后面跟(可能修改过的)timestamp 和 record。
为什么不用 Logstash 的 truncate
Fluent Bit 的 filter 体系没有内置的字段截断功能,Lua 脚本是官方推荐的扩展方式,性能好且逻辑完全可控。
观测云对照
观测云 Pipeline 内置了字符串处理函数,不需要写 Lua——一行 truncate() 或在 grok 后配合字符串函数即可截断超长字段,且提供在线调试即时验证效果。
常见问题(FAQ)
Q:为什么要截断日志?
A:超长日志(如几 MB 的请求 body、完整 SQL 语句)会消耗存储和网络带宽、拖慢检索。通常只留前几百到几千字符用于排查。
Q:多个字段都要截断?
A:在 Lua 函数里对每个字段重复判断即可,或写个循环遍历指定字段列表。
Q:截断会影响日志原文吗?
A:Fluent Bit 管道内的修改是单向的,输出侧看到的就是截断后的内容。如果需要保留原文,可同时输出一份到对象存储做原始归档。