Fluentd 如何分离 Docker 容器的 stdout 与 stderr 日志?

Docker 日志驱动输出的 JSON 中每条记录带 stream 字段(stdout/stderr)。Fluentd 用 rewrite_tag_filter 按 stream 值改写 tag,即可把两条流分别路由到不同输出。本文给出完整配置。

最佳实践
Fluentd 如何分离 Docker 容器的 stdout 与 stderr 日志?封面

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 镜像已内置。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台