配置日志记录驱动程序

预计阅读时间:8分钟

Docker包含多种日志记录机制,可帮助您 从正在运行的容器和服务中获取信息。这些机制称为日志记录驱动程序。每个Docker守护程序都有一个默认的日志记录驱动程序,除非您将其配置为使用其他日志记录驱动程序或简称为“ log-driver”,否则每个容器都将使用该日志记录驱动程序。

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

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

默认情况下,不执行日志旋转。结果,默认json-file日志记录驱动程序日志记录驱动程序存储的日志文件会导致大量磁盘空间用于产生大量输出的容器,这可能导致磁盘空间耗尽。

Docker保留json文件日志记录驱动程序(无日志旋转)作为默认值,以保持与旧版本Docker的向后兼容性,以及在将Docker用作Kubernetes的运行时的情况。

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

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

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

默认的日志记录驱动程序是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,以使更改对新创建的容器生效。现有容器不使用新的日志记录配置。

笔记

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日志选项控制环的大小的缓冲区用于中间消息存储时mode设定为non-blockingmax-buffer-size 默认为1兆字节。

以下示例以非阻塞模式和4 MB缓冲区启动日志输出的Alpine容器:

$ 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)日志记录。
logentries 将日志消息写入Rapid7 Logentries。

笔记

当使用多克引擎19.03或以上,该docker logs命令 是唯一的功能了localjson-filejournald日志记录的驱动程序。Docker 20.10及更高版本引入了“双重日志记录”,该日志记录使用本地缓冲区,该缓冲区允许您将docker logs命令用于任何日志记录驱动程序。有关详细信息,请参阅 使用远程日志记录驱动程序时阅读日志

日志记录驱动程序的局限性

  • 读取日志信息需要解压缩旋转的日志文件,这会导致磁盘使用情况暂时增加(直到从旋转文件中读取日志条目为止),并且在解压缩时会增加CPU使用率。
  • Docker数据目录所在的主机存储的容量决定了日志文件信息的最大大小。
码头工人日志驱动