You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Fluentbit将Python多行Traceback转换为单行采集上报?

完全可以通过Fluent Bit的内置功能实现该需求,无需依赖第三方组件。

实现思路

  • 首先使用Fluent Bit的Multiline Parser(多行解析器)识别Python异常栈的行边界,将属于同一条异常的所有行合并为单条日志记录,此时记录内容保留原始换行符
  • 再通过Lua过滤器将合并后日志中的换行符替换为转义字符(如\n),最终输出为单行格式的完整异常栈

具体配置示例

1. 新增多行解析规则(parsers.conf)

[MULTILINE_PARSER]
    name          python_traceback_multiline
    type          regex
    flush_timeout 1000
    # 规则1:匹配所有新日志的起始行,不匹配该规则的行都会被归为上一条日志的内容
    rule      "start_state"   "/(^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d+\]|^\[pid:|^[A-Za-z]+[ :]|^Checking for|^Duplicate request)/"  "cont"
    # 规则2:匹配异常栈的连续行(缩进行、Traceback开头行、异常类型开头行)
    rule      "cont"          "/^\s+|^Traceback|^[A-Za-z]*Error:/"  "cont"

2. 日志采集配置引用多行解析器(fluent-bit.conf)

以采集文件日志为例,在INPUT段指定使用上面定义的多行解析器:

[INPUT]
    name              tail
    path              /path/to/your/app/stdout.log
    multiline.parser  python_traceback_multiline
    tag               python.app.logs
    read_from_head    true

3. 新增Lua过滤器转换为单行

[FILTER]
    name    lua
    match   python.app.logs
    call    replace_newline
    code    function replace_newline(tag, timestamp, record)
                -- 将所有换行符替换为转义的\n,也可根据需求替换为空格
                record["log"] = record["log"]:gsub("[\r\n]+", "\\n")
                return 2, timestamp, record
            end

配置说明

  • 多行解析规则的起始行正则可根据实际业务日志格式调整,只要覆盖所有独立日志行的开头特征即可,避免不同日志被错误合并
  • 如果不需要保留换行格式,可直接将换行符替换为空格,不影响异常栈的可读性
  • flush_timeout参数控制未匹配到新行时的缓冲超时时间,单位为毫秒,避免日志丢失

内容的提问来源于stack exchange,提问作者Yeahia Md Abid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:36:04