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

如何配置Fluent Bit 1.9.8解析Log4J2多行日志?

Log4J2多行日志的Fluent Bit 1.9.8多行解析器配置问题

我的Log4J2日志格式配置如下:

%d [%20.20t] [%10.10X{nthread}] [%20.20X{tid}] [%20.20X{app}] (%30.30c{3}) %-5p %X{stack} %X{rid} %X{uid} - %m%n

已编写可用的单日志行解析正则:

(?<timestamp>[\d-]+ [\d:,]+) \[\s*(?<thread>[^\]]+)?\] \[\s*(?<nthread>[^\]]+)?\] \[\s*(?<tid>[^\]]+)?\] \[\s*(?<app>[^\]]+)?\] \(\s*(?<logger>[^\]]+)?\) (?<level>\S+) (?<stack>[^-]+) - (?<message>.*)

现在要为Fluent Bit 1.9.8配置多行解析器,当前配置框架如下:

[MULTILINE_PARSER]
  Name    custom_app_default
  Type    regex
  #
  # rules   | state name     | regex pattern           | next state
  # --------|----------------| ------------------------|-----------
  rule       "start_state"     "/([\d-]+ [\d:,]+)/"     "cont"
  rule       "cont"            {CONFUSED_PART_HERE}     "cont"

尝试用前瞻正则/^(?![\d-]+ [\d:,]+)/匹配非日期开头的行,但未成功。输入的tail插件配置如下:

[INPUT]
  Name              tail
  Path              /opt/log-mount/**/CustomApp_CORE.log
  Path_Key          filename
  Multiline.Parser  custom_app_default
  Mem_Buf_Limit     5MB
  Skip_Long_Lines   Off
  Refresh_Interval  10

[INPUT]
  Name              tail
  Path              /opt/log-mount/**/CustomApp_ALERTS.log
  Path_Key          filename
  Multiline.Parser  custom_app_default
  Mem_Buf_Limit     5MB
  Skip_Long_Lines   Off
  Refresh_Interval  10

请问如何正确配置多行解析器,将下一个日期格式之前的所有内容合并为单条日志?


解决方案

Fluent Bit的多行正则解析器有几个关键注意点:

  1. 正则模式无需用/包裹,直接写表达式内容即可
  2. 规则是匹配整行内容,必须覆盖行的全部内容
  3. 否定前瞻的写法需要结合行首锚点,确保逻辑准确

正确的多行解析器配置如下:

[MULTILINE_PARSER]
  Name    custom_app_default
  Type    regex
  #
  # rules   | state name     | regex pattern           | next state
  # --------|----------------| ------------------------|-----------
  rule       "start_state"     "^([\d-]+ [\d:,]+)"     "cont"
  rule       "cont"            "^(?!([\d-]+ [\d:,]+)).*"     "cont"

配置说明:

  • 起始规则:用^锚定行首,确保只匹配以指定日期格式开头的行,匹配后进入cont状态
  • 续行规则:
    • ^(?!([\d-]+ [\d:,]+)):行首否定前瞻,排除以日期格式开头的行
    • .*:匹配该行剩余所有内容
    • 保持cont状态,继续合并后续符合条件的行

如果遇到版本兼容性问题(比如部分Fluent Bit版本对前瞻支持有限),可以用更简单的写法:假设所有续行都不以数字开头(日期以数字开头),直接匹配非数字开头的行:

rule       "cont"            "^[^0-9].*"     "cont"

这种写法更简洁,适用于日志续行没有数字开头的场景,避免复杂语法带来的问题。

内容的提问来源于stack exchange,提问作者el n00b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:30:56