配置日志记录驱动程序

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 数据目录所在的主机存储的容量 确定日志文件信息的最大大小。