配置日志驱动程序
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"
}
如果日志驱动程序具有可配置选项,则可以将其作为具有键 log-opts
的 JSON 对象设置在 daemon.json
文件中。以下示例在 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 守护程序当前的默认日志驱动程序,请运行 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 提供两种模式用于将消息从容器传递到日志驱动程序
- (默认) 从容器到驱动程序的直接、阻塞式交付
- 非阻塞式交付,将日志消息存储在每个容器的中间缓冲区中,供驱动程序使用。
非阻塞
消息传递模式可以防止应用程序由于日志反压而阻塞。当 STDERR 或 STDOUT 流阻塞时,应用程序可能会以意外的方式失败。
警告
当缓冲区已满时,不会将新消息入队。丢弃消息通常比阻塞应用程序的日志写入过程更可取。
mode
日志选项控制是否使用阻塞
(默认)或非阻塞
消息传递。
当mode
设置为non-blocking
时,max-buffer-size
控制用于中间消息存储的缓冲区大小。默认为1m
,表示 1 MB(100万字节)。参见go-units
包中的FromHumanSize()
函数了解允许的格式字符串,例如1KiB
表示1024字节,2g
表示20亿字节。
以下示例启动一个Alpine容器,其日志输出为非阻塞模式,缓冲区大小为4MB。
$ 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数据目录所在的宿主存储容量决定了日志文件信息的最大大小。