一、了解 Docker 日志
我们以 nginx 为例来了解 docker log。
启动 nginx 容器:
$ docker run \
-d \
-p 80:80 \
--name nginx \
nginx
访问首页:
$ curl localhost
查看日志:
$ docker logs -f nginx
# 输出
172.17.0.1 - - [08/Jan/2019:03:38:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
docker 日志输出的就是 nginx 的日志,为什么呢?因为 nginx 把日志输出到了容器内的控制台,docker 的日志对应的就是控制台。
docker 中有一个日志驱动器,查看一下:
$ docker info | grep 'Logging Driver'
Logging Driver: json-file
当前使用的日志驱动器是 json-file
,容器内部的应用程序所输出的日志会自动写入一个 JSON 文件,日志位置:/var/lib/docker/containers/<容器ID>/<容器ID>-json.log
docker 提供了很多日志驱动器,例如:
- none:容器不输出任何日志
- json-file:容器输出的日志以JSON格式写入文件中(默认)
- syslog:容器输出的日志写入宿主机的Syslog中
- fluentd:容器输出的日志写入宿主机的Fluentd中
- splunk:容器输出的日志写入splunk中
- nats:容器输出的日志写入NATS服务器中
...
可以在启动容器时指定,例如:
docker run \
-d \
-p 80:80 \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
--name nginx \
nginx
-
--log-opt max-size=10m
表示日志文件最大为10m,超过后自动生成新文件 -
--log-opt max-file=3
表示日志文件最多为3个,超过后自动删除旧的
docker log 文档:
https://docs.docker.com/engine/admin/logging/overview/
二、Docker 日志结构
三、整合 syslog
syslog 是 linux 强大的日志系统,Rsyslog
是 syslog 的标准实现,linux 已经默认安装,查看一下:
$ rsyslogd -v
# 输出
rsyslogd 8.16.0, compiled with:
PLATFORM: x86_64-pc-linux-gnu
PLATFORM (lsb_release -d):
FEATURE_REGEXP: Yes
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported: Yes
64bit Atomic operations supported: Yes
memory allocator: system default
Runtime Instrumentation (slow code): No
uuid support: Yes
Number of Bits in RainerScript integers: 64
See http://www.rsyslog.com for more information.
(1)开启 syslog
我们需要开启 Rsyslog 服务,打开配置文件:
$ vi /etc/rsyslog.conf
找到:
#module(load="imtcp")
#input(type="imtcp" port="514")
去掉前面的注释符 #
,然后重启服务:
$ systemctl restart rsyslog
查看是否正常启动:
$ netstat -anpt | grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 7290/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 7290/rsyslogd
(2)指定 syslog
下面启动容器,指定使用 syslog:
# 先删除之前的容器
$ docker stop nginx
$ docker rm nginx
# 启动
$ docker run \
-d \
-p 80:80 \
--name nginx \
--log-driver syslog \
--log-opt syslog-address=tcp://localhost:514 \
nginx
(3)测试
在一个终端窗口中监听日志:
$ tail -f /var/log/syslog
在另一个终端中访问nginx:
$ curl localhost
在日志窗口中就可以看到nginx日志输出了。
(4)日志文件中指定容器标识
如果系统中启动了多个容器,每个容器的日志都输出到 syslog,就比较混乱了,这时我们可以在日志中指定容器tag,从而方便识别出相应的日志。
启动容器时指定tag:
$ docker run \
-d \
-p 80:80 \
--name nginx \
--log-driver syslog \
--log-opt syslog-address=tcp://localhost:514 \
--log-opt tag="nginx" \
nginx
tag还可以更精确一点,因为docker提供了丰富的模板标签:
- {{.ID}}:容器ID的前12个字符
- {{.FullID}}:容器ID的完整名称
- {{.Name}}:容器名称
- {{.ImageID}}:容器镜像ID的前12个字符
- {{.ImageFullID}}:容器镜像ID的完整名称
- {{.ImageName}}:容器镜像名称
- {{.DaemonName}}:Docker守护进程名称(名为docker)
示例:
$ docker run \
-d \
-p 80:80 \
--name nginx \
--log-driver syslog \
--log-opt syslog-address=tcp://localhost:514 \
--log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}" \
nginx
访问并查看日志:
Jan 8 04:11:50 localhost nginx/nginx/dae10543a3b1[6675]: 172.17.0.1 - - [08/Jan/2019:04:11:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
可以看到已经有了我们设置的tag。