配置日志记录驱动程序

Docker 包含多种日志记录机制,可帮助您 从正在运行的容器和服务获取信息。这些机制称为日志记录驱动程序。每个 Docker 守护进程都有一个默认的日志记录驱动程序,每个容器都会使用该驱动程序,除非您将其配置为使用不同的日志记录驱动程序(简称为日志驱动程序)。

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

提示:使用local日志记录驱动程序来防止磁盘耗尽

默认情况下,不执行日志轮转。因此,默认 json-file日志记录驱动程序存储的日志文件可能会导致生成大量输出的容器使用大量磁盘空间,从而导致磁盘空间耗尽。

Docker 将 json 文件日志记录驱动程序(不带日志轮换)保留为默认值,以保持与旧版本 Docker 的向后兼容性,并且适用于 Docker 用作 Kubernetes 运行时的情况。

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

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

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

默认日志记录驱动程序是json-file.以下示例将默认日志记录驱动程序设置为 local日志驱动程序

{
  "log-driver": "local"
}

如果日志记录驱动程序具有可配置选项,您可以 daemon.json使用 key 将它们设置为 JSON 对象log-opts。以下示例在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 或 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 提供了两种从容器向日志驱动程序传递消息的模式:

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

消息non-blocking传递模式可以防止应用程序因日志背压而阻塞。当 STDERR 或 STDOUT 流阻塞时,应用程序可能会以意想不到的方式失败。

警告

当缓冲区已满时,新消息将不会入队。删除消息通常优于阻止应用程序的日志写入过程。

日志mode选项控制是否使用blocking(默认)或 non-blocking消息传递。

当设置为时,日志max-buffer-size选项控制用于中间消息存储的缓冲区的大小。 默认为 1 兆字节。modenon-blockingmax-buffer-size

以下示例启动一个 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 守护程序的默认日志记录驱动程序(在以下示例中为 )启动容器,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。
splunksplunk使用 HTTP 事件收集器写入日志消息。
etwlogs将日志消息写入 Windows 事件跟踪 (ETW) 事件。仅适用于 Windows 平台。
gcplogs将日志消息写入 Google Cloud Platform (GCP) 日志记录。

日志记录驱动程序的限制

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