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
相关产品推荐
相关产品推荐

