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

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 文档:

Configure logging drivers | Docker Documentation

二、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")

$template motanFormat,"%timestamp% %fromhost-ip% %msg%\n"

$template motanFile,"/var/log/motan.log"

:msg, contains, "motan" ?motanFile;motanFormat

:msg, contains, "motan" ~

去掉前面的注释符 #,然后重启服务:

$ service rsyslog restart

查看是否正常启动:

$ 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老帽爬新坡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值