将 docker log 与远程日志记录驱动程序结合使用

概述

无论配置的日志记录驱动程序或插件如何,您都可以使用该docker logs命令读取容器日志。 Docker Engine 使用 local 日志记录驱动程序作为缓存来读取容器的最新日志。这称为双重日志记录。默认情况下,缓存启用日志文件轮换,并且每个容器最多包含 5 个文件,每个文件大小为 20 MB(压缩前)。

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

先决条件

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

docker logs以下示例显示了在具有和不具有双日志记录可用性的情况下运行命令的结果:

没有双记录功能

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

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

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

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

    $ 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)
      }
    }
    
  • 第二步:启动容器

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

    $ 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因任何原因失败(文件系统已满、写入权限已删除),则缓存写入会失败并记录在守护程序日志中。不会重试缓存中的日志条目。
  • 在默认配置中,某些日志可能会从缓存中丢失,因为环形缓冲区用于防止在文件写入缓慢的情况下阻塞容器的 stdio。管理员必须在守护进程关闭时修复这些问题。