配置日志记录驱动程序
Docker 包含多种日志记录机制,可帮助您从 运行容器和服务。这些机制称为日志记录驱动程序。 每个 Docker 守护程序都有一个默认的日志记录驱动程序,每个容器都使用它 除非将其配置为使用不同的日志记录驱动程序,或者将 短。
默认情况下,Docker 使用json-file日志记录驱动程序哪
在内部将容器日志缓存为 JSON。除了使用日志记录驱动程序
包含在 Docker 中,您还可以实现和使用日志记录驱动程序插件。
提示
使用
locallogging 驱动程序以防止磁盘耗尽。默认情况下,不执行日志轮换。因此,由 违约json-file日志记录驱动程序logging 驱动程序可能会导致 大量磁盘空间用于生成大量 output,这可能会导致磁盘空间耗尽。Docker 将 json 文件日志记录驱动程序(没有日志轮换)作为默认值 保持与旧版本 Docker 的向后兼容性,以及在某些情况下 其中 Docker 用作 Kubernetes 的运行时。
对于其他情况,
local建议使用 logging 驱动程序,因为它会执行 log-rotation 的 S Rotate,并使用更高效的文件格式。请参阅下面的 配置默认日志记录驱动程序 部分,了解如何配置locallogging 驱动程序作为默认值, 和 Local File Logging Driver 页面,了解有关locallogging 驱动程序。
配置默认日志记录驱动程序
要将 Docker 守护程序配置为默认使用特定的日志记录驱动程序,请将
的值log-driver添加到daemon.json配置文件。请参阅dockerd参考手册了解详情。
默认日志记录驱动程序为json-file.以下示例将默认值
logging 驱动程序添加到local日志驱动程序:
{
  "log-driver": "local"
}如果日志记录驱动程序具有可配置的选项,您可以在daemon.jsonfile 作为 JSON 对象,键为log-opts.以下内容
example 在json-file日志记录驱动程序:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}重新启动 Docker,以使更改对新创建的容器生效。 现有容器不会自动使用新的日志记录配置。
注意
log-opts配置选项中的daemon.json配置文件必须 以字符串形式提供。布尔值和数值(例如max-file)必须用引号 () 括起来。"
如果未指定日志记录驱动程序,则默认值为json-file.
要查找 Docker 守护程序的当前默认日志记录驱动程序,请运行docker info并搜索Logging Driver.您可以使用以下内容
命令(在 Linux、macOS 上)或 PowerShell (在 Windows 上):
$ docker info --format '{{.LoggingDriver}}'
json-file
注意
更改守护进程中的默认日志记录驱动程序或日志记录驱动程序选项 配置仅影响在配置后创建的容器 已更改。现有容器保留 在创建它们时使用。要更新容器的日志记录驱动程序, 必须使用所需的选项重新创建 container。 请参阅下面的为容器配置日志记录驱动程序部分,了解如何查找 容器。
为容器配置日志记录驱动程序
启动容器时,您可以将其配置为使用不同的日志记录
driver 而不是 Docker 守护程序的默认值,使用--log-driver旗。如果
logging 驱动程序具有可配置的选项,您可以使用一个或多个
的实例--log-opt <NAME>=<VALUE>旗。即使容器使用
default logging 驱动程序,它可以使用不同的可配置选项。
以下示例使用nonelogging 驱动程序。
$ docker run -it --log-driver none alpine ash
要查找正在运行的容器的当前日志记录驱动程序,如果守护进程
正在使用json-filelogging 驱动程序中,运行以下docker inspect命令,将容器名称或 ID 替换为<CONTAINER>:
$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>
json-file
配置日志消息从容器到日志驱动的投递模式
Docker 提供了两种模式,用于将消息从容器投递到日志 司机:
- (默认)直接,阻止从容器到驱动程序的交付
- 非阻塞传递,将日志消息存储在每个容器的中间缓冲区中,供驱动程序使用
这non-blocking消息传递模式可防止应用程序因
对 log 背压。在以下情况下,应用程序可能会以意外方式失败
STDERR 或 STDOUT 流阻止。
警告
当缓冲区已满时,新邮件将不会排入队列。丢弃消息通常比阻止 应用程序的日志写入过程。
这modelog 选项控制是否使用blocking(默认)或non-blocking消息传递。
这max-buffer-size控制用于
中间消息存储mode设置为non-blocking.
默认值为1m这意味着 1 MB(100 万字节)。
看功能FromHumanSize()在go-units包对于允许的格式字符串,
一些例子是1KiB对于 1024 字节,2g20 亿字节。
以下示例启动一个 Alpine 容器,其日志输出为非阻塞 mode 和 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 启动
守护程序的默认日志记录驱动程序(在以下示例中,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 | 将日志消息写入 splunk使用 HTTP 事件收集器。 | 
| etwlogs | 将日志消息写入 Windows 事件跟踪 (ETW) 事件。仅在 Windows 平台上可用。 | 
| gcplogs | 将日志消息写入 Google Cloud Platform (GCP) Logging。 | 
日志记录驱动程序的限制
- 读取日志信息需要解压缩轮换的日志文件,这会导致 磁盘使用率临时增加(直到来自轮换的 文件读取)和解压缩时 CPU 使用率增加。
- Docker 数据目录所在的主机存储的容量 确定日志文件信息的最大大小。