配置日志记录驱动程序

Docker 包含多种日志记录机制,可帮助您从 运行容器和服务。这些机制称为日志记录驱动程序。 每个 Docker 守护程序都有一个默认的日志记录驱动程序,每个容器都使用它 除非将其配置为使用不同的日志记录驱动程序,或者将 短。

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

提示

使用日志记录驱动程序来防止磁盘耗尽。默认情况下,不执行日志轮换。因此,由 默认 JSON 文件日志记录驱动程序日志记录驱动程序可能会导致 大量磁盘空间用于生成大量 output,这可能会导致磁盘空间耗尽。local

Docker 将 json 文件日志记录驱动程序(没有日志轮换)作为默认值 保持与旧版本 Docker 的向后兼容性,以及在某些情况下 其中 Docker 用作 Kubernetes 的运行时。

对于其他情况,建议使用日志记录驱动程序,因为它会执行 log-rotation 的 S Rotate,并使用更高效的文件格式。请参阅下面的配置默认日志记录驱动程序部分,了解如何将日志记录驱动程序配置为默认驱动程序。 以及本地文件日志记录驱动程序页面,了解有关日志记录驱动程序的更多详细信息。locallocallocal

配置默认日志记录驱动程序

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

默认日志记录驱动程序为 .以下示例将默认值 logging 驱动程序复制到本地日志驱动程序中:json-file

{
  "log-driver": "local"
}

如果日志记录驱动程序具有可配置的选项,则可以在文件中将它们设置为具有键的 JSON 对象。以下内容 example 在 logging 驱动程序上设置四个可配置选项:daemon.jsonlog-optsjson-file

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

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

注意

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

如果未指定日志记录驱动程序,则默认值为 。 要查找 Docker 守护程序的当前默认日志记录驱动程序,请运行并搜索 。您可以使用以下内容 命令(在 Linux、macOS 上)或 PowerShell (在 Windows 上):json-filedocker infoLogging Driver

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

json-file

注意

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

为容器配置日志记录驱动程序

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

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

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

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

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

json-file

配置日志消息从容器到日志驱动的投递模式

Docker 提供了两种模式,用于将消息从容器投递到日志 司机:

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

消息传送模式可防止应用程序因 对 log 背压。在以下情况下,应用程序可能会以意外方式失败 STDERR 或 STDOUT 流阻止。non-blocking

警告

当缓冲区已满时,新邮件将不会排入队列。丢弃消息通常比阻止 应用程序的日志写入过程。

的 log 选项控制是使用 (default) 还是 message delivery。modeblockingnon-blocking

控制用于 中间消息存储 设置为 时。 默认值为 1 MB(100 万字节)。 请参阅 go-units中的函数 FromHumanSize() 以获取允许的格式字符串。 一些示例适用于 1024 字节,适用于 20 亿字节。max-buffer-sizemodenon-blocking1m1KiB2g

以下示例启动一个 Alpine 容器,其日志输出为非阻塞 mode 和 4 MB 缓冲区:

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

将环境变量或标签与日志记录驱动程序一起使用

某些日志记录驱动程序将容器的值或标志添加到容器的日志中。此示例使用 Docker 启动 daemon 的默认日志记录驱动程序(在以下示例中为 ),但 设置环境变量 。--env|-e--labeljson-fileos=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将日志记录消息写入 facility。守护程序必须在主机上运行。syslogsyslog
journald将日志消息写入 。守护程序必须在主机上运行。journaldjournald
gelf将日志消息写入 Graylog 扩展日志格式 (GELF) 终端节点,例如 Graylog 或 Logstash。
fluentd将日志消息写入 (forward input)。守护程序必须在主机上运行。fluentdfluentd
awslogs将日志消息写入 Amazon CloudWatch Logs。
splunk使用 HTTP 事件收集器将日志消息写入 。splunk
etwlogs将日志消息写入 Windows 事件跟踪 (ETW) 事件。仅在 Windows 平台上可用。
gcplogs将日志消息写入 Google Cloud Platform (GCP) Logging。

日志记录驱动程序的限制

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