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

K8s环境中FluentBit多行解析失效,Pod日志无法合并至CloudWatch

问题诊断

你的多行日志合并失效核心原因有几点:

  1. Docker_Mode 阻断合并逻辑:主应用日志INPUT启用了Docker_Mode On,该模式会强制将每行日志视为独立条目,直接跳过后续multiline合并处理。
  2. 过滤器顺序错误:当前multiline过滤器放在kubernetes过滤器之后,而kubernetes过滤器开启了Merge_Log On,会把原始日志解析后存入log_processed字段,导致multiline过滤器指定的multiline.key_content log无法定位到正确的目标内容。
  3. 缺失多行解析规则:custom_parsers.conf里只定义了普通日志解析器([PARSER]),但Fluent Bit合并多行需要的是[MULTILINE]格式的规则块,你之前配置的multiline过滤器找不到对应的合并逻辑。
  4. CRI解析器正则有误:自定义的cri解析器正则过于复杂,无法正确匹配CRI格式的日志行,影响后续合并流程。

修正后的配置

1. 调整fluent-bit.conf关键部分

[SERVICE]
    Flush         2
    Log_Level     info
    Daemon        Off
    Parsers_File  parsers.conf
    Parsers_File  custom_parsers.conf
    HTTP_Server   On
    HTTP_Listen   0.0.0.0
    HTTP_Port     2020

# 主应用日志输入:关闭Docker_Mode,改用多行解析规则
[INPUT]
    Name                tail
    Tag                 application.*
    Exclude_Path        /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
    Path                /var/log/containers/*.log
    # 关闭Docker_Mode,避免与multiline冲突
    # Docker_Mode         On
    # Docker_Mode_Flush   5
    # Docker_Mode_Parser  container_firstline
    Parser              docker
    Multiline.parser    cri-multiline, docker-multiline
    DB                  /var/fluent-bit/state/flb_container.db
    Mem_Buf_Limit       50MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Rotate_Wait         30
    Read_from_Head      Off

# fluent-bit自身日志输入:添加多行支持
[INPUT]
    Name                tail
    Tag                 application.*
    Path                /var/log/containers/fluent-bit*
    Parser              docker
    Multiline.parser    docker-multiline
    DB                  /var/fluent-bit/state/flb_log.db
    Mem_Buf_Limit       5MB
    Skip_Long_Lines     On
    Refresh_Interval    10
    Read_from_Head      Off

# cloudwatch-agent日志输入:调整多行配置
[INPUT]
    Name                tail
    Tag                 application.*
    Path                /var/log/containers/cloudwatch-agent*
    Multiline.parser    cri-multiline, docker-multiline
    Parser              docker
    DB                  /var/fluent-bit/state/flb_cwagent.db
    rotate_wait         15
    Mem_Buf_Limit       5MB
    Skip_Long_Lines     On
    Refresh_Interval    10

# 先合并多行日志,再处理Kubernetes元数据
[FILTER]
    Name               multiline
    Match              application.*
    multiline.key_content log
    multiline.parser   cri-multiline, docker-multiline

[FILTER]
    Name                kubernetes
    Match               application.*
    Kube_URL            https://kubernetes.default.svc:443
    Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
    Kube_Tag_Prefix     application.var.log.containers.
    Merge_Log           On
    Merge_Log_Key       log_processed
    K8S-Logging.Parser  On
    K8S-Logging.Exclude Off
    Labels              Off
    Annotations         Off

# 其余OUTPUT、INPUT、FILTER配置保持不变

2. 更新custom_parsers.conf,添加多行解析规则

[PARSER]
    Name                docker
    Format              json
    Time_Key            time
    Time_Format         %Y-%m-%dT%H:%M:%S.%LZ

[PARSER]
    Name               cri
    Format             regex
    Regex              ^(?<time>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z) (?<stream>stdout|stderr) (?<logtag>[FP]) (?<log>.*)$
    Time_Key            time
    Time_Format         %Y-%m-%dT%H:%M:%S.%LZ
    Time_Keep           On

[PARSER]
    Name                syslog
    Format              regex
    Regex               ^(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$
    Time_Key            time
    Time_Format         %b %d %H:%M:%S

# CRI格式多行日志解析规则:匹配带时间戳的起始行,其余行合并到上一行
[MULTILINE]
    Name          cri-multiline
    Type          regex
    Regex         ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z
    Negate        false
    Match         previous

# Docker格式多行日志解析规则:匹配JSON格式的起始行,其余行合并到上一行
[MULTILINE]
    Name          docker-multiline
    Type          regex
    Regex         ^{\"log\":\"
    Negate        false
    Match         previous

关键调整说明

  • 关闭Docker_Mode:取消该模式的强制拆分行为,让multiline过滤器能够正常处理合并逻辑。
  • 调整过滤器顺序:先执行multiline合并,再添加Kubernetes元数据,确保合并后的完整日志被正确处理。
  • 新增MULTILINE规则块:定义针对CRI和Docker格式的多行识别逻辑,明确日志起始行的匹配规则,将后续非起始行合并到上一行。
  • 简化CRI解析器正则:使用标准CRI日志匹配规则,确保正确解析日志结构,为合并流程提供可靠的log字段。

内容的提问来源于stack exchange,提问作者VINEETH REDDY SIRIPURAM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:29:54