配置日志驱动程序

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 =标志实例来设置它们。即使容器使用默认的日志驱动,它也可以使用不同的可配置选项。

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

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

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

$ 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 亿字节。

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

$ 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"}

支持的日志驱动程序

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

DriverDescription
noneNo logs are available for the container and docker logs does not return any output.
localLogs are stored in a custom format designed for minimal overhead.
json-fileThe logs are formatted as JSON. The default logging driver for Docker.
syslogWrites logging messages to the syslog facility. The syslog daemon must be running on the host machine.
journaldWrites log messages to journald. The journald daemon must be running on the host machine.
gelfWrites log messages to a Graylog Extended Log Format (GELF) endpoint such as Graylog or Logstash.
fluentdWrites log messages to fluentd (forward input). The fluentd daemon must be running on the host machine.
awslogsWrites log messages to Amazon CloudWatch Logs.
splunkWrites log messages to splunk using the HTTP Event Collector.
etwlogsWrites log messages as Event Tracing for Windows (ETW) events. Only available on Windows platforms.
gcplogsWrites log messages to Google Cloud Platform (GCP) Logging.

日志驱动程序的限制

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