更多文章:WorkMap技术博客
查看容器日志
docker logs
命令显示运行容器的日志。
docker service logs
命令显示参与服务的所有容器的日志。
日志内容和格式取决于容器的内应用程序执行的命令。
默认情况下,docker logs
或 docker service logs
显示命令的输出,就像在终端交互式运行命令时一样。
UNIX 和 Linux 命令通常在运行时打开三个 I/O 流,称为 STDIN、STDOUT 和 STDERR。STDIN 是命令的输入流,可能包括来自键盘或另一个命令的输入。
STDOUT 通常是命令的正常输出,而 STDERR 通常用于输出错误消息。
默认情况下,docker logs
显示命令的 STDOUT 和 STDERR。
除此之外,也可以参考以下的日志方案:
-
官方 nginx 镜像:
官方 nginx 镜像创建了一个符号链接从 /var/log/nginx/access.log 到 /dev/stdout,并创建另一个符号链接从 /var/log/nginx/error.log 到 /dev/stderr,覆盖日志文件并导致日志被发送到相应的特殊设备。请参阅 Dockerfile。
-
官方 httpd 驱动程序:
更改 httpd 应用程序的配置,直接将其正常输出写入 /proc/self/fd/1(即 STDOUT),将其错误写入 /proc/self/fd/2(即 STDERR)。请参阅 Dockerfile。
管理容器日志
Docker 包含多个日志机制,从运行的容器和服务中获取日志信息。这些机制称为日志驱动程序。
默认情况下,Docker 使用 json-file
日志驱动程序,它在内部将容器日志缓存为 JSON。
提示:
-
使用
local
日志驱动程序以防止磁盘耗尽 -
默认的
json-file
日志驱动,不执行日志轮换。因此,存储的日志文件可能会占用大量磁盘空间,导致磁盘空间耗尽。 -
Docker 保留了
json-file
日志驱动程序(没有日志轮换)作为默认设置,以保持与旧版本 Docker 的向后兼容性,并用于将 Docker 用作 Kubernetes 的运行时的情况。 -
建议使用“local”日志驱动程序,它默认执行日志轮换,并使用更高效的文件格式。
修改默认日志驱动的参数
-
修改
daemon.json
文件,如下所示:{ “log-driver”:“json-file”, “log-opts”:{ “max-size”:“10m”, “max-file”:“3”, “labels”:“production_status”, “env”:“os,customer” } }
-
重新启动Docker以使更改对新创建的容器生效。
注意:现有容器不会使用新的日志记录配置(需要重新创建容器才会生效)。
daemon.json配置文件中的log-opts配置选项必须为字符串。
-
查看日志驱动配置:
docker info --format '.{{LoggingDriver}}'
配置容器的日志记录驱动程序
启动容器时,可以使用--log-driver
标志将其配置为使用不同于Docker守护程序默认值的日志记录驱动程序。
如果日志记录驱动程序具有可配置选项,则可以使用一个或多个--log-opt <NAME>=<VALUE>
标志设置。
即使容器使用默认的日志记录驱动程序,它也可以使用不同的可配置选项。
- 使用
none
日志记录驱动程序启动Alpine容器。docker run -it --log-driver none alpine ash
- 查看正在运行的容器的日志记录驱动程序
docker inspect -f '.{{HostConfig.LogConfig.Type}}' <CONTAINER>
配置从容器到日志记录驱动程序的日志消息传递模式
Docker提供了两种从容器到日志记录驱动程序传递消息的模式:
- 阻塞式:直接从容器到驱动程序的传递
- 非阻塞式传递:将日志消息存储在每个容器的中间缓冲区中,以供驱动程序使用
非阻塞消息传递模式可防止应用由于日志反压而阻塞。当STDERR或STDOUT流阻塞时,应用很可能会以意外的方式失败。
警告:
当缓冲区已满时,新消息将不会排队。删除消息通常优于阻止应用程序的日志写入过程。
-
mode参数
控制是否使用阻塞(默认)或非阻塞消息传递。
-
max-buffer-size参数
控制在将模式设置为非阻塞时用于中间消息存储的缓冲区大小。默认为1兆字节。
使用示例
- 非阻塞模式启动Alpine容器,并使用4兆字节缓冲区进行日志输出:
docker run -it --log-opt mode = non-blocking --log-opt max-buffer-size = 4m alpine ping 127.0.0.1
- 使用环境变量或标签与日志记录驱动程序
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 (forward input)。主机必须运行 fluentd 守护程序。
-
awslogs
将日志消息写入 Amazon CloudWatch Logs。
-
splunk
使用 HTTP 事件收集器将日志消息写入 splunk。
-
etwlogs
将日志消息作为 Windows 平台的事件跟踪 (ETW) 事件写入。仅在 Windows 平台上可用。
-
gcplogs
将日志消息写入 Google Cloud Platform (GCP) 日志记录。
-
logentries
将日志消息写入 Rapid7 Logentries。
注意:
Docker Engine 19.03以及以前的版本,docker logs 命令仅适用于本地、json-file 和 journald 日志记录驱动程序。
Docker 20.10 及更高版本引入了“双重日志记录”,它使用本地缓冲区,可以对任何日志记录驱动程序使用 docker logs 命令。
日志记录驱动程序的限制
读取日志信息需要解压已轮换的日志文件,这会导致磁盘使用量暂时增加(直到读取轮换文件中的日志条目),并在解压时增加 CPU 使用率。
Docker 数据目录所在主机存储的容量决定了日志文件信息的最大大小。