Docker 日志整合 syslog

一、了解 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

image

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 日志结构

image
image

三、整合 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。

你可能感兴趣的:(Docker 日志整合 syslog)