使用带有远程日志驱动程序的 docker logs

概述

您可以使用 docker logs 命令读取容器日志,无论配置的日志驱动或插件是什么。Docker Engine 使用 local 日志驱动作为缓存,用于读取容器的最新日志。 这被称为双重日志记录。默认情况下,缓存启用了日志文件轮换, 并且每个容器最多限制为 5 个文件,每个文件 20 MB(压缩前)。

请参阅 配置选项部分以自定义 这些默认值,或参阅 禁用双重日志记录 部分以禁用此功能。

前提条件

如果配置的日志驱动程序不支持读取日志,Docker 引擎会自动启用双重日志记录。

以下示例显示了运行 docker logs 命令在有和没有双重日志可用性时的结果:

不具备双重日志记录功能

当容器配置了远程日志驱动程序(如 splunk)时, 且禁用了双重日志记录,尝试在本地读取容器 日志时会显示错误:

  • 步骤 1:配置 Docker 守护进程

    $ cat /etc/docker/daemon.json
    {
      "log-driver": "splunk",
      "log-opts": {
        "cache-disabled": "true",
        ... (options for "splunk" logging driver)
      }
    }
    
  • 步骤 2:启动容器

    $ docker run -d busybox --name testlog top
    
  • 步骤 3:读取容器日志

    $ docker logs 7d6ac83a89a0
    Error response from daemon: configured logging driver does not support reading
    

具有双日志记录能力

启用双重日志缓存后,即使日志驱动程序不支持读取日志,也可以使用 docker logs 命令读取日志。以下示例显示了一个使用 splunk 远程日志驱动程序作为默认值,并启用了双重日志缓存的守护进程配置:

  • 步骤 1:配置 Docker 守护进程

    $ cat /etc/docker/daemon.json
    {
      "log-driver": "splunk",
      "log-opts": {
        ... (options for "splunk" logging driver)
      }
    }
    
  • 步骤 2:启动容器

    $ docker run -d busybox --name testlog top
    
  • 步骤 3:读取容器日志

    $ docker logs 7d6ac83a89a0
    2019-02-04T19:48:15.423Z [INFO]  core: marked as sealed
    2019-02-04T19:48:15.423Z [INFO]  core: pre-seal teardown starting
    2019-02-04T19:48:15.423Z [INFO]  core: stopping cluster listeners
    2019-02-04T19:48:15.423Z [INFO]  core: shutting down forwarding rpc listeners
    2019-02-04T19:48:15.423Z [INFO]  core: forwarding rpc listeners stopped
    2019-02-04T19:48:15.599Z [INFO]  core: rpc listeners successfully shut down
    2019-02-04T19:48:15.599Z [INFO]  core: cluster listeners successfully shut down
    

注意

对于支持读取日志的日志驱动程序,例如 localjson-filejournald 驱动程序,在双日志功能可用之前或之后,功能上没有区别。对于这些驱动程序,在这两种情况下都可以使用 docker logs 读取日志。

配置选项

双日志缓存接受与 local日志驱动程序相同的配置选项,但带有cache-前缀。这些选项可以为每个容器指定,并且可以使用 守护进程配置文件为新容器设置默认值。

默认情况下,缓存启用了日志文件轮换,并且每个容器最多限制为5个文件,每个文件大小为20MB(压缩前)。使用下面描述的配置选项来自定义这些默认值。

选项默认描述
cache-disabled"false"禁用本地缓存。作为字符串传递的布尔值(true10false)。
cache-max-size"20m"缓存轮换前的最大大小。一个正整数加上一个表示度量单位的修饰符(kmg)。
cache-max-file"5"可以存在的最大缓存文件数量。如果轮换日志会产生过多的文件,则删除最旧的文件。一个正整数。
cache-compress"true"启用或禁用已轮换日志文件的压缩。作为字符串传递的布尔值(true10false)。

禁用双重日志缓存

使用 cache-disabled 选项来禁用双重日志缓存。在日志仅通过远程日志系统读取且无需通过 docker logs 进行调试目的的情况下,禁用缓存有助于节省存储空间。

可以为单个容器禁用缓存,或者在使用 守护进程配置文件时,默认为新容器禁用缓存。

以下示例使用守护进程配置文件将 splunk 日志驱动程序设置为默认,并禁用缓存:

$ cat /etc/docker/daemon.json
{
  "log-driver": "splunk",
  "log-opts": {
    "cache-disabled": "true",
    ... (options for "splunk" logging driver)
  }
}

注意

对于支持读取日志的日志驱动程序,例如 localjson-filejournald 驱动程序,不使用双重日志记录,并且禁用该选项 没有任何效果。

限制

  • 如果使用日志驱动程序或插件将日志远程发送的容器 遇到网络问题,则不会发生将 write 写入本地缓存的情况。
  • 如果由于任何原因(文件系统已满、写入权限被移除)向 logdriver 写入失败,缓存写入将失败并在守护进程日志中记录。对缓存的日志条目不会重试。
  • 在默认配置下,由于使用环形缓冲区以防止在文件写入缓慢时阻塞容器的标准输入输出,因此可能会从缓存中丢失一些日志。管理员必须在守护进程关闭时修复这些问题。