Fluentd 如何分离 Docker 容器的 stdout 与 stderr 日志?
Docker 日志驱动输出的 JSON 中每条记录带 stream 字段(stdout/stderr)。Fluentd 用 rewrite_tag_filter 按 stream 值改写 tag,即可把两条流分别路由到不同输出。本文给出完整配置。
Docker 的 json-file 日志中每条记录都有 stream 字段标记来源——Fluentd 用 rewrite_tag_filter 插件按它的值改写 tag(如 stdout.app / stderr.app),后续 match 按 tag 分流处理即可。
配置示例
<source>
@type tail
path /var/log/containers/*.log
tag docker.*
<parse>
@type json
</parse>
</source>
<match docker.**>
@type rewrite_tag_filter
<rule>
key stream
pattern ^stdout$
tag stdout.${tag}
</rule>
<rule>
key stream
pattern ^stderr$
tag stderr.${tag}
</rule>
</match>
<match stderr.**>
@type elasticsearch
index_name error-logs # stderr 单独进错误索引
...
</match>
<match stdout.**>
@type elasticsearch
index_name access-logs
...
</match>
典型玩法
- stderr 单独建索引/告警——错误流重点盯防;
- stdout 全量存档,stderr 额外发通知;
- 只采 stderr,丢弃 stdout 降噪(流量大的服务)。
观测云对照
观测云 DataKit 的容器日志采集自动识别 stdout/stderr 流并打标,日志查看器中按 stream 字段筛选即可;按流分流告警在监控器中配置条件完成。
常见问题(FAQ)
Q:K8s 环境的容器日志路径? 同样在 /var/log/containers/,文件名已含 Pod 信息,配合 kubernetes_metadata 插件补全 Pod 标签。
Q:rewrite_tag_filter 要装插件吗? 是插件(fluent-plugin-rewrite-tag-filter),官方 td-agent/fluentd 镜像已内置。