配置日志驱动程序
Docker 包含多种日志记录机制,可帮助您从运行中的容器和服务获取信息。这些机制称为日志驱动程序。每个 Docker daemon 都有一个默认的日志驱动程序,每个容器都会使用该驱动程序,除非您将其配置为使用不同的日志驱动程序(简称 log driver)。
默认情况下,Docker 使用 json-file
日志驱动程序,该驱动程序在内部将容器日志缓存为 JSON 格式。除了使用 Docker 附带的日志驱动程序,您还可以实现和使用日志驱动程序插件。
提示
使用
local
日志驱动程序以防止磁盘耗尽。默认情况下,不执行日志轮换。因此,对于产生大量输出的容器,默认的json-file
日志驱动程序 存储的日志文件可能会占用大量磁盘空间,从而导致磁盘空间耗尽。Docker 保留
json-file
日志驱动程序(不进行日志轮换)作为默认设置,以保持与旧版本 Docker 的向后兼容性,以及适用于 Docker 用作 Kubernetes 运行时的场景。对于其他情况,推荐使用
local
日志驱动程序,因为它默认执行日志轮换,并且使用更高效的文件格式。请参阅下方的配置默认日志驱动程序部分,了解如何将local
日志驱动程序配置为默认设置;并参阅local 文件日志驱动程序页面,了解local
日志驱动程序的更多详情。
配置默认日志驱动程序
要将 Docker daemon 配置为默认使用特定的日志驱动程序,请在 daemon.json
配置文件中将 log-driver
的值设置为日志驱动程序的名称。详情请参阅 dockerd
参考手册 中的“daemon configuration file”部分。
默认日志驱动程序是 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 使更改对新创建的容器生效。现有容器不会自动使用新的日志配置。
注意
daemon.json
配置文件中的log-opts
配置选项必须以字符串形式提供。布尔值和数值(例如上述示例中max-file
的值)因此必须用引号("
)括起来。
如果不指定日志驱动程序,默认为 json-file
。要查找 Docker daemon 当前的默认日志驱动程序,运行 docker info
并搜索 Logging Driver
。您可以在 Linux、macOS 或 Windows 上的 PowerShell 中使用以下命令:
$ docker info --format '{{.LoggingDriver}}'
json-file
注意
更改 daemon 配置中的默认日志驱动程序或日志驱动程序选项仅影响更改配置后创建的容器。现有容器保留创建时使用的日志驱动程序选项。要更新容器的日志驱动程序,必须使用所需的选项重新创建容器。请参阅下面的为容器配置日志驱动程序部分,了解如何查找容器的日志驱动程序配置。
为容器配置日志驱动程序
启动容器时,可以使用 --log-driver
标志将其配置为使用与 Docker daemon 默认驱动程序不同的日志驱动程序。如果日志驱动程序有可配置选项,可以使用一个或多个 --log-opt
标志实例来设置它们。即使容器使用默认日志驱动程序,它也可以使用不同的可配置选项。
以下示例启动一个使用 none
日志驱动程序的 Alpine 容器。
$ docker run -it --log-driver none alpine ash
如果 daemon 使用的是 json-file
日志驱动程序,要查找正在运行容器的当前日志驱动程序,请运行以下 docker inspect
命令,将容器名称或 ID 替换为 <CONTAINER>
:
$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>
json-file
配置从容器到日志驱动程序的日志消息传递模式
Docker 提供了两种将消息从容器传递到日志驱动程序的模式:
- (默认) 从容器到驱动程序的直接、阻塞式传递
- 非阻塞式传递,将日志消息存储在每个容器的中间缓冲区中供驱动程序消费
非阻塞式消息传递模式可防止应用程序因日志记录背压而阻塞。当 STDERR 或 STDOUT 流阻塞时,应用程序可能会以意想不到的方式失败。
警告
当缓冲区满时,新消息将不会入队。通常,丢弃消息比阻塞应用程序的日志写入过程更可取。
mode
日志选项控制是使用阻塞式(默认)还是非阻塞式消息传递。
max-buffer-size
控制当 mode
设置为 non-blocking
时用于中间消息存储的缓冲区大小。默认值为 1m
,表示 1 MB(100 万字节)。有关允许的格式字符串,请参阅go-units
包中的 FromHumanSize()
函数,例如 1KiB
表示 1024 字节,2g
表示 20 亿字节。
以下示例启动一个 Alpine 容器,其日志输出采用非阻塞模式,缓冲区大小为 4 MB。
$ docker run -it --log-opt mode=non-blocking --log-opt max-buffer-size=4m alpine ping 127.0.0.1
将环境变量或标签与日志驱动程序一起使用
一些日志驱动程序会将容器的 --env|-e
或 --label
标志的值添加到容器日志中。此示例使用 Docker daemon 的默认日志驱动程序(在以下示例中为 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 daemon 必须在宿主机上运行。 |
journald | 将日志消息写入 journald 。journald daemon 必须在宿主机上运行。 |
gelf | 将日志消息写入 Graylog Extended Log Format (GELF) 端点,例如 Graylog 或 Logstash。 |
fluentd | 将日志消息写入 fluentd (forward 输入)。fluentd daemon 必须在宿主机上运行。 |
awslogs | 将日志消息写入 Amazon CloudWatch Logs。 |
splunk | 使用 HTTP Event Collector 将日志消息写入 splunk 。 |
etwlogs | 将日志消息写入 Windows 事件跟踪 (ETW) 事件。仅在 Windows 平台上可用。 |
gcplogs | 将日志消息写入 Google Cloud Platform (GCP) Logging。 |
日志驱动程序的限制
- 读取日志信息需要解压缩轮换的日志文件,这会导致磁盘使用量暂时增加(直到读取轮换文件中的日志条目)并在解压缩时增加 CPU 使用率。
- Docker 数据目录所在的宿主存储容量决定了日志文件信息的最大大小。