Fluent Bit 中如何截断超长的日志消息?

Fluent Bit 截断超长日志最灵活的方式是用 Lua filter 写脚本按长度截断字段。本文给出 truncate.lua 示例和 Fluent Bit 配置,以及观测云 Pipeline 的等价做法。

最佳实践
Fluent Bit 中如何截断超长的日志消息?封面

最通用的做法:写一个 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 管道内的修改是单向的,输出侧看到的就是截断后的内容。如果需要保留原文,可同时输出一份到对象存储做原始归档。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台