将 docker logs 与远程日志驱动程序一起使用
概述
无论配置的日志记录驱动程序或插件是什么,您都可以使用 docker logs 命令来读取容器日志。Docker 引擎使用 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
注意对于支持读取日志的日志记录驱动程序,例如
local、json-file和journald驱动程序,双重日志记录功能可用前后,其功能没有区别。对于这些驱动程序,两种情况下都可以使用docker logs读取日志。
配置选项
双重日志记录缓存接受与 local 日志记录驱动程序相同的配置选项,但带有 cache- 前缀。这些选项可以按容器指定,新容器的默认值可以使用守护进程配置文件来设置。
默认情况下,缓存已启用日志文件轮换,每个容器最多限制为 5 个 20MB 的文件(压缩前)。使用下面描述的配置选项来自定义这些默认值。
| 选项 | 默认值 | 描述 |
|---|---|---|
cache-disabled | "false" | 禁用本地缓存。布尔值以字符串形式传递(true、1、0 或 false)。 |
cache-max-size | "20m" | 缓存轮换前的最大大小。一个正整数加上一个代表计量单位的修饰符(k、m 或 g)。 |
cache-max-file | "5" | 可以存在的最大缓存文件数。如果轮换日志创建了多余的文件,则会删除最旧的文件。一个正整数。 |
cache-compress | "true" | 启用或禁用对轮换的日志文件进行压缩。布尔值以字符串形式传递(true、1、0 或 false)。 |
禁用双重日志记录缓存
使用 cache-disabled 选项禁用双重日志记录缓存。在只需要通过远程日志系统读取日志,并且不需要通过 docker logs 读取日志进行调试的情况下,禁用缓存有助于节省存储空间。
使用守护进程配置文件时,可以为单个容器禁用缓存,也可以为新容器默认禁用缓存。
以下示例使用守护进程配置文件将 splunk 日志记录驱动程序作为默认,并禁用缓存。
$ cat /etc/docker/daemon.json
{
"log-driver": "splunk",
"log-opts": {
"cache-disabled": "true",
... (options for "splunk" logging driver)
}
}
注意对于支持读取日志的日志记录驱动程序,如
local、json-file和journald驱动程序,不使用双重日志记录,禁用该选项没有效果。
限制
- 如果使用日志记录驱动程序或插件发送远程日志的容器出现网络问题,则不会向本地缓存进行任何 `write` 操作。
- 如果因任何原因(文件系统已满、写入权限被移除)对 `logdriver` 的写入失败,则缓存写入也会失败,并记录在守护进程日志中。不会重试对缓存的日志条目写入。
- 在默认配置下,由于使用环形缓冲区以防止在文件写入缓慢时阻塞容器的 stdio,某些日志可能会从缓存中丢失。管理员必须在守护进程关闭时修复这些问题。