docker日志管理

日志管理

1.查看容器日志

默认情况下, 执行docker logs <CONTAINER ID>可以看到一个容器的输入日志.其中包括STDOUT标准输出和STDERR标准错误输出.但是在有些情况下, 你可能无法查看到一些有用的信息.比如:

  • 如果你在容器中,将文件记录到某个文件,外部服务或者数据库中去.那么信息将无法通过标准输出和标准错误输出进行打印,自然也没法通过docker logs查看到.
  • 如果你的容器运行着一个非交互式进程(如WEB服务器或者数据库),该应用程序可能会将其输出发送到日志文件中去.

第一种情况下,你的日志可以通过其他方式进行处理,你可以不选择使用docker的日志模式输出.第二种情况下,一些官方的镜像解决了这个问题,比如nginx的官方镜像把/var/log/nginx/access.log软连接到了/dev/stdout设备上,并且把/var/log/nginx/error.log同时软连接到而来/dev/stderr设备上.官方的httpd服务则直接将标准输出,错误输出写到相应的设备上.

2.配置日志驱动程序

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

配置docker默认的日志记录驱动程序, 通过--log-driver=<VALUE>,在dockerd启动的使用指定。

1
2
3
#查找Docker守护程序的当前默认日志驱动程序
$ docker info |grep 'Logging Driver'
Logging Driver: json-file

又或者指定某个容器的日志驱动程序,通过--log-driver=<VALUE>来启动容器,通过--log-opt <NAME>=<VALUE>来指定相关参数

1
2
3
docker run --log-driver=syslog --log-opt syslog-facility=daemon registry
#或者,通过设置进行日志轮转
docker run -d --log-driver=json-file --log-opt max-size=1k --log-opt max-file=5 registry

支持的日志驱动格式如下:

驱动 解释
none 容器中不会有日志,docker logs不会返回任何输出。
json-file 日志格式为JSON。Docker的默认日志记录驱动程序。
syslog 将记录消息写入syslog设备。该syslog守护程序必须在主机上运行。
journald 将日志消息写入journald。该journald守护程序必须在主机上运行。
gelf 将日志消息写入Graylog扩展日志格式(GELF)端点,如Graylog或Logstash。
fluentd 将日志消息写入fluentd(正向输入)。该fluentd守护程序必须在主机上运行。
awslogs 将日志消息写入Amazon CloudWatch日志。
splunk 将日志消息写入splunk使用HTTP事件收集器。
etwlogs 将日志消息写入Windows事件跟踪(ETW)事件。仅在Windows平台上可用。
gcplogs 将日志消息写入Google Cloud Platform(GCP)日志记录。

docker logs命令不适用于比其他驱动程序json-file 和journald。

3.使用相关的日志驱动

你可以通过打印日志的时候加入对应标签或者环境变量

1
2
3
4
5
6
7
8
9
10
11
#指定参数运行dockerd进程
$ dockerd \
--log-driver=json-file \
--log-opt labels=production_status \
--log-opt env=os,customer
# 运行一个镜像,并指定相关标签或环境变量
$ docker run -dit --label production_status=testing -e os=ubuntu alpine sh
# 查看日志打印,会发现打印了相关信息.
"attrs":{"production_status":"testing","os":"ubuntu"}

所有驱动程序共有的一些选项:

这些选项仅适用于Docker CE Edge版本

驱动 解释 示例
mode 设置日志记录模式,接受的值为blocking(默认)和non-blocking。何时non-blocking设置,如果日志缓冲区填满,日志消息将丢失。如何删除邮件是未定义的。 –log-opt mode=non-blocking
max-buffer-size 仅适用于mode设置时non-blocking,这将设置日志缓冲区的最大大小。达到此大小后,日志消息将被删除。 –log-opt max-buffer-size 5m
4.none引擎
1
$ docker run -it --log-driver none alpine ash
5.json-file引擎
1
$ docker run -it --log-opt max-size=10m --log-opt max-file=3 alpine ash
选项 解释 示例
max-size 日志在滚动之前的最大大小。一个正整数加上代表测量单位的改性剂(k,m,或g)。 –log-opt max-size=10m
max-file 可以存在的最大日志文件数。如果滚动日志会创建多余的文件,则删除最旧的文件。只有有效时max-size也设置。正整数。 –log-opt max-file=3
labels 启动Docker守护程序时适用。这个守护进程将接受的与日志相关的标签的逗号分隔列表。用于高级日志标签选项。 –log-opt labels=production_status,geo
env 启动Docker守护程序时适用。这个守护进程将接受的与日志相关的环境变量的逗号分隔列表。用于高级日志标签选项。 –log-opt env=os,customer

注意:如果max-size并max-file设置,docker logs则只返回最新日志文件中的日志行。

6.syslog引擎

发送到远程syslog服务器上

1
2
3
4
5
$ docker run \
--log-driver=syslog \
--log-opt syslog-address=tcp://192.168.0.42:123 \
--log-opt syslog-facility=daemon \
alpine ash

或者使用TLS加密

1
2
3
4
5
6
7
$ docker run \
--log-driver=syslog \
--log-opt syslog-address=tcp+tls://192.168.0.42:123 \
--log-opt syslog-tls-ca-cert=/etc/ca-certificates/custom/ca.pem \
--log-opt syslog-tls-cert=/etc/ca-certificates/custom/cert.pem \
--log-opt syslog-tls-key=/etc/ca-certificates/custom/key.pem \
alpine ash

选项 解释 示例
syslog-address 外部syslog服务器的地址。该URI指定符可以是[tcp|udp1|tcp+tls]://host:port,unix://path,或unixgram://path。如果传输是tcp,,udp或者tcp+tls,默认端口是514。 –log-opt syslog-address=tcp+tls://192.168.1.3:514, –log-opt syslog-address=unix:///tmp/syslog.sock
syslog-facility 使用的syslog设施。可以是任何有效syslog设施的号码或名称。请参阅syslog文档。 –log-opt syslog-facility=daemon
syslog-tls-ca-cert 由CA签署的信任证书的绝对路径。如果地址协议没有,则忽略tcp+tls。 –log-opt syslog-tls-ca-cert=/etc/ca-certificates/custom/ca.pem
syslog-tls-cert TLS证书文件的绝对路径。如果地址协议没有,则忽略tcp+tls。 –log-opt syslog-tls-cert=/etc/ca-certificates/custom/cert.pem
syslog-tls-key TLS密钥文件的绝对路径。如果地址协议没有,则忽略tcp+tls。 –log-opt syslog-tls-key=/etc/ca-certificates/custom/key.pem
syslog-tls-skip-verify 如果设置为true,则在连接到syslog守护程序时将跳过TLS验证。默认为false。如果地址协议没有,则忽略tcp+tls。 –log-opt syslog-tls-skip-verify=true
tag 附加到消息APP-NAME中的字符串syslog。默认情况下,Docker使用容器ID的前12个字符标记日志消息。请参阅日志标签选项文档以自定义日志标记格式。 –log-opt tag=mailer
syslog-format syslog要使用的消息格式。如果未指定,则使用本地UNIX系统日志格式,而不指定主机名。指定rfc3164RFC-3164兼容格式,rfc5424适用于RFC-5424兼容格式,或rfc5424micro为具有微秒时间戳分辨率的RFC-5424兼容格式指定。 –log-opt syslog-format=rfc5424micro
labels 启动Docker守护程序时适用。这个守护进程将接受的与日志相关的标签的逗号分隔列表。用于高级日志标签选项。 –log-opt labels=production_status,geo
env 启动Docker守护程序时适用。这个守护进程将接受的与日志相关的环境变量的逗号分隔列表。用于高级日志标签选项。 –log-opt env=os,customer

其余tag相关的自定义配置, 详见日志驱动程序的标记,以及其余日志记录引擎的详细配置可以参考官网日志记录引擎详解.