配置日志驱动

Docker 包含多种日志记录机制,帮助您从正在运行的容器和服务中获取信息。这些机制称为日志驱动程序。每个 Docker 守护进程都有一个默认的日志驱动程序,除非您将其配置为使用不同的日志驱动程序,否则每个容器都会使用它,简称日志驱动程序。

默认情况下,Docker 使用 json-file 日志驱动程序, 该驱动程序在内部将容器日志缓存为 JSON。除了使用 Docker 附带的日志驱动程序外,您还可以实现和使用 日志驱动程序插件

提示

使用 local 日志驱动程序以防止磁盘耗尽。默认情况下,不执行日志轮换。因此,对于生成大量输出的容器,默认的json-file 日志驱动程序存储的日志文件可能会占用大量磁盘空间,从而导致磁盘空间耗尽。

Docker 将 json-file 日志驱动(不带日志轮转)保留为默认设置,以保持与旧版本 Docker 的向后兼容性,并适用于将 Docker 用作 Kubernetes 运行时的场景。

对于其他情况,推荐使用 local 日志驱动,因为它默认执行日志轮换,并使用更高效的文件格式。请参阅下方的 配置默认日志驱动 部分,了解如何将 local 日志驱动配置为默认驱动,以及 本地文件日志驱动 页面,获取关于 local 日志驱动的更多详细信息。

配置默认日志驱动

要配置 Docker 守护进程默认使用特定的日志驱动程序,请在 daemon.json 配置文件中将 log-driver 的值设置为日志驱动程序的名称。有关详细信息,请参阅 dockerd 参考手册 中的“守护进程配置文件”部分。

默认日志驱动程序是 json-file。以下示例将默认 日志驱动程序设置为 local 日志驱动程序

{
  "log-driver": "local"
}

如果日志驱动程序具有可配置选项,您可以在 daemon.json 文件中将它们设置为 JSON 对象,键为 log-opts。以下 示例在 json-file 日志驱动程序上设置了四个可配置选项:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}

重启 Docker 以使更改对新创建的容器生效。 现有容器不会自动使用新的日志配置。

注意

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

如果您不指定日志驱动,默认为 json-file。 要查找 Docker 守护进程的当前默认日志驱动,请运行 docker info 并搜索 Logging Driver。您可以在 Linux、macOS 或 Windows 上的 PowerShell 中使用以下 命令:

$ docker info --format '{{.LoggingDriver}}'

json-file

注意

更改守护进程配置中的默认日志驱动程序或日志驱动程序选项仅会影响在配置更改后创建的容器。现有容器保留创建时所使用的日志驱动程序选项。要更新容器的日志驱动程序,必须使用所需的选项重新创建容器。 请参阅下面的 为容器配置日志驱动程序 部分,以了解如何查找容器的日志驱动程序配置。

配置容器的日志驱动程序

当您启动容器时,您可以使用 --log-driver 标志将其配置为使用与 Docker 守护进程默认值不同的日志驱动程序。如果日志驱动程序具有可配置选项,您可以使用一个或多个 --log-opt <NAME>=<VALUE> 标志实例来设置它们。即使容器使用默认日志驱动程序,它也可以使用不同的可配置选项。

以下示例使用 none 日志驱动程序启动 Alpine 容器。

$ docker run -it --log-driver none alpine ash

要查找运行中容器的当前日志驱动程序,如果守护进程正在使用 json-file 日志驱动程序,请运行以下 docker inspect 命令,将容器名称或ID替换为 <CONTAINER>

$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>

json-file

配置容器到日志驱动程序的日志消息传递模式

Docker 提供两种模式,用于将消息从容器传递到日志驱动程序:

  • (默认) 从容器到驱动的直接、阻塞式传输
  • 非阻塞传递,将日志消息存储在每个容器的中间缓冲区中,供驱动程序使用

non-blocking 消息传递模式防止应用程序因日志背压而阻塞。当 STDERR 或 STDOUT 流阻塞时,应用程序可能会以意想不到的方式失败。

警告

当缓冲区已满时,新消息将不会被排队。丢弃消息通常比阻塞应用程序的日志写入过程更受欢迎。

mode 日志选项控制是否使用 blocking(默认)或 non-blocking 消息传递方式。

max-buffer-size 控制用于 中间消息存储的缓冲区大小,当 mode 设置为 non-blocking 时。 默认值是 1m,表示 1 MB(100 万字节)。 请参阅 go-units 包中的函数 FromHumanSize() 了解允许的格式字符串, 一些示例包括 1KiB 表示 1024 字节,2g 表示 20 亿字节。

以下示例以非阻塞模式和4兆字节缓冲区启动一个Alpine容器并输出日志:

$ docker run -it --log-opt mode=non-blocking --log-opt max-buffer-size=4m alpine ping 127.0.0.1

使用日志驱动程序的环境变量或标签

某些日志驱动程序会将容器的 --env|-e--label 标志的值添加到容器的日志中。此示例使用 Docker 守护进程的默认日志驱动程序(在以下示例中,json-file)启动一个容器,但 设置了环境变量 os=ubuntu

$ docker run -dit --label production_status=testing -e os=ubuntu alpine sh

如果日志驱动支持此功能,这会将额外的字段添加到日志输出中。以下输出由 json-file 日志驱动生成:

"attrs":{"production_status":"testing","os":"ubuntu"}

支持的日志驱动

支持以下日志驱动。如果适用,请参阅每个驱动文档的链接以获取其可配置选项。如果您正在使用 日志驱动插件,您可能会 看到更多选项。

驱动程序描述
none容器没有可用的日志,且 docker logs 不返回任何输出。
local日志以自定义格式存储,旨在最大限度地减少开销。
json-file日志以 JSON 格式输出。这是 Docker 的默认日志驱动。
syslog将日志消息写入到 syslog 设施。主机上必须运行 syslog 守护进程。
journald将日志消息写入 journald。主机上必须运行 journald 守护进程。
gelf将日志消息写入 Graylog 扩展日志格式(GELF)端点,例如 Graylog 或 Logstash。
fluentd将日志消息写入 fluentd (转发输入)。主机上必须运行 fluentd 守护进程。
awslogs将日志消息写入 Amazon CloudWatch Logs。
splunk使用 HTTP 事件收集器将日志消息写入 splunk
etwlogs将日志消息作为 Windows 事件跟踪 (ETW) 事件写入。仅在 Windows 平台上可用。
gcplogs将日志消息写入 Google Cloud Platform (GCP) Logging。

日志驱动的限制

  • 读取日志信息需要解压缩已轮换的日志文件,这会导致磁盘使用量临时增加(直到读取完已轮换文件中的日志条目),并且在解压缩过程中会增加CPU使用率。
  • Docker 数据目录所在的主机存储的容量决定了日志文件信息的最大大小。