Fluentd 日志驱动

fluentd 日志驱动将容器日志作为结构化日志数据发送到 Fluentd 收集器。然后,用户可以使用 Fluentd 的各种输出插件 将这些日志写入各种目标。

除了日志消息本身,fluentd 日志驱动还在结构化日志消息中发送以下元数据

字段描述
container_id完整的 64 字符容器 ID。
container_name容器启动时的名称。如果你使用 docker rename 重命名容器,新名称不会反映在日志条目中。
sourcestdoutstderr
log容器日志

使用方法

通过多次指定 --log-opt,可以支持一些选项

  • fluentd-address:指定连接 Fluentd 守护进程的套接字地址,例如 fluentdhost:24224unix:///path/to/fluentd.sock
  • tag:指定 Fluentd 消息的标签。支持一些 Go 模板标记,例如 {{.ID}}{{.FullID}}{{.Name}} docker.{{.ID}}

要将 fluentd 驱动用作默认日志驱动,请在 daemon.json 文件中将 log-driverlog-opt 键设置为适当的值,该文件位于 Linux 主机上的 /etc/docker/ 或 Windows Server 上的 C:\ProgramData\docker\config\daemon.json。有关使用 daemon.json 配置 Docker 的更多信息,请参阅 daemon.json

以下示例将日志驱动设置为 fluentd 并设置 fluentd-address 选项。

{
  "log-driver": "fluentd",
  "log-opts": {
    "fluentd-address": "fluentdhost:24224"
  }
}

重启 Docker 以使更改生效。

注意

daemon.json 配置文件中的 log-opts 配置选项必须以字符串形式提供。因此,布尔值和数值(例如 fluentd-asyncfluentd-max-retries 的值)必须用引号(")括起来。

要为特定容器设置日志驱动,请将 --log-driver 选项传递给 docker run

$ docker run --log-driver=fluentd ...

在使用此日志驱动之前,启动一个 Fluentd 守护进程。默认情况下,日志驱动通过 localhost:24224 连接到此守护进程。使用 fluentd-address 选项连接到不同的地址。

$ docker run --log-driver=fluentd --log-opt fluentd-address=fluentdhost:24224

如果容器无法连接到 Fluentd 守护进程,除非使用 fluentd-async 选项,否则容器会立即停止。

选项

用户可以使用 --log-opt NAME=VALUE 标志来指定额外的 Fluentd 日志驱动选项。

fluentd-address

默认情况下,日志驱动连接到 localhost:24224。提供 fluentd-address 选项以连接到不同的地址。支持 tcp(默认)和 unix 套接字。

$ docker run --log-driver=fluentd --log-opt fluentd-address=fluentdhost:24224
$ docker run --log-driver=fluentd --log-opt fluentd-address=tcp://fluentdhost:24224
$ docker run --log-driver=fluentd --log-opt fluentd-address=unix:///path/to/fluentd.sock

上面两个选项指定了相同的地址,因为 tcp 是默认值。

tag

默认情况下,Docker 使用容器 ID 的前 12 个字符标记日志消息。有关自定义日志标签格式的信息,请参阅 日志标签选项文档

labels, labels-regex, env 和 env-regex

labelsenv 选项都接受一个逗号分隔的键列表。如果 labelenv 键之间发生冲突,env 的值优先。这两个选项都会向日志消息的额外属性添加附加字段。

env-regexlabels-regex 选项分别类似于 envlabels,并且与之兼容。它们的值是用于匹配与日志相关的环境变量和标签的正则表达式。它用于高级日志标签选项

fluentd-async

Docker 在后台连接到 Fluentd。消息被缓冲直到建立连接。默认值为 false

fluentd-async-reconnect-interval

当启用 fluentd-async 时,fluentd-async-reconnect-interval 选项定义了重新建立与 fluentd-address 连接的时间间隔(以毫秒为单位)。如果地址解析为一个或多个 IP 地址(例如 Consul 服务地址),此选项会很有用。

fluentd-buffer-limit

设置内存中缓冲的事件数量。记录将存储在内存中,最多达到此数量。如果缓冲区已满,记录日志的调用将失败。默认值为 1048576。(https://github.com/fluent/fluent-logger-golang/tree/master#bufferlimit)

fluentd-retry-wait

两次重试之间的等待时间。默认值为 1 秒。

fluentd-max-retries

最大重试次数。默认值为 4294967295 (2**32 - 1)。

fluentd-sub-second-precision

生成纳秒级分辨率的事件日志。默认值为 false

使用 Docker 管理 Fluentd 守护进程

关于 Fluentd 本身,请参阅 项目网页其文档

要使用此日志驱动,请在宿主机上启动 fluentd 守护进程。我们建议您使用 Fluentd Docker 镜像。如果要将每个宿主机上的多个容器日志聚合起来,然后将其传输到另一个 Fluentd 节点以创建聚合存储,此镜像特别有用。

测试容器日志记录器

  1. 编写一个配置文件(test.conf)以转储输入日志

    <source>
      @type forward
    </source>
    
    <match *>
      @type stdout
    </match>
  2. 使用此配置文件启动 Fluentd 容器

    $ docker run -it -p 24224:24224 -v /path/to/conf/test.conf:/fluentd/etc/test.conf -e FLUENTD_CONF=test.conf fluent/fluentd:latest
    
  3. 使用 fluentd 日志驱动启动一个或多个容器

    $ docker run --log-driver=fluentd your/application
    
页面选项