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

Kubernetes 1.22 EKS集群配置fluent-concat-plugin拼接拆分日志方法

问题根因

你之前的三类配置失效,分别对应三个明确的配置错误:

  • use_partial_cri_logtag是CRI系运行时(containerd、CRI-O)专用的配置项,仅适用于CRI格式的日志,Docker JSON日志驱动输出的内容根本不存在logtag字段,配置后必然触发字段不存在的报错,阻断整个日志处理流程。
  • 配置multiline_end_regexp /\\n$/后日志完全不输出,是因为正则写了双反斜杠,匹配的是字面量字符串\n,而Docker拆分日志的分片末尾是真实换行符,正则永远无法命中结束标识,所有日志都会积压在concat插件的缓存里最终被丢弃,自然不会进入ES。
  • 配置use_partial_metadata true仍无法拼接分片,核心是缺了两个关键参数:一是没有配置分片等待超时,二是多worker部署场景下没有配置分片路由规则,同一条日志的不同分片可能被分配到不同worker处理无法拼接;另外如果concat filter没有放在所有处理链路的最前面,被前置插件删掉了Docker生成的partial_id类元数据字段,也会直接导致拼接逻辑失效。
正确配置方案

前置说明

以下配置针对Docker作为容器运行时、使用默认json-file日志驱动的EKS集群,如果你用的是EKS 1.24及以上默认的containerd运行时,直接跳转到文末的containerd适配配置。

1. 输入段配置保持不变

你原有的tail输入配置不需要调整:

<source>
  @type tail
  @id in_tail_container_logs
  path /var/log/containers/*.log
  pos_file /var/log/fluentd-containers.log.pos
  tag raw.containers.*
  read_from_head true
  <parse>
    @type json
    time_type string
    time_format %Y-%m-%dT%H:%M:%S.%NZ
    keep_time_key true
  </parse>
</source>

2. 第一优先级配置concat拼接filter

注意:这个filter必须放在所有其他处理容器日志的filter最前面,不能在它之前加任何日志解析、字段修改类插件,避免元数据字段被删除导致拼接失效

<filter raw.containers.**>
  @type concat
  key log
  # 启用Docker json-file驱动的partial日志元数据识别
  use_partial_metadata true
  # 分片拼接时不插入额外分隔符
  separator ""
  # 配置分片等待超时:10秒没收到同一条日志的下一个分片就直接输出已接收内容,避免日志堆积
  timeout 10s
  # 以Docker生成的partial_id作为分片唯一标识,保证多worker场景下同一条日志的分片路由到同一处理线程
  use_partial_metadata_key true
</filter>

3. 后续日志处理流程

concat配置完成后,你原有的日志解析、格式化、输出到ES的插件按原有顺序放在这个filter后面即可,不需要调整。

配置验证与排查

配置完成后重启Fluentd DaemonSet,按以下标准验证:

  • 长度超过16KB的日志在ES中为完整单条文档,不会被拆分为多条
  • 普通长度小于16KB的日志不会被错误拼接,正常输出
  • Fluentd运行日志无字段缺失、缓存溢出类报错
    如果仍存在拼接失败的情况,先登录EKS节点直接查看/var/log/containers/下的原始日志文件,确认拆分的分片是否携带partial_id、partial_ordinal、partial_last字段:如果没有这些字段,说明你的集群实际使用的是containerd运行时,需要切换为containerd适配配置。
containerd运行时适配配置

如果你的EKS集群用containerd作为运行时,将concat filter替换为以下配置即可,注意要保证tail输入能正常解析出原始日志中的logtag、stream字段:

<filter raw.containers.**>
  @type concat
  key log
  use_partial_cri_logtag true
  partial_cri_logtag_key logtag
  partial_cri_stream_key stream
  separator ""
  timeout 10s
</filter>

注意:不要混用Docker partial元数据和CRI logtag两种拼接逻辑,也不要同时配置多行正则匹配规则,否则会出现规则冲突导致拼接失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:51:25