本文是关于docker日志第三篇,更换docker日志驱动为-syslog。在之前的两篇文章: Docker容器日志分析介绍过docker的json日志滚动策略; fluentd收集kubernetes 集群日志分析分析kubernetes中fluentd收集docke容器日志原理。
准备测试容器
准备一个自动生成日志的容器,其 Dockerfile
如下:
FROM alpine:3.7 CMD [ "sh", "-c", "while true; do echo hello; sleep 10; done"]
测试容器很简单,每10s打印一次 hello 到控制台。
准备测试环境
测试环境,选择使用compose,其文件 docker-compose.yaml
如下:
version: '3' services: # https://github.com/rsyslog/rsyslog-docker rsyslog: image: rsyslog/syslog_appliance_alpine ports: - "514:514" volumes: - ./logs:/logs logapp: build: ./app image: logapp:0.0.1 depends_on: - rsyslog logging: driver: "syslog" options: syslog-address: "tcp://127.0.0.1:514" tag: "app" labels: "testing,frontend"
rsyslog
服务使用容器方式运行,省去物理机配置,方便清理。rsyslog
服务又作为 logapp
测试容器的日志接收器。
注意mac需要替换127.0.0.1为物理IP
测试
在 docker-compose.yaml
目录使用 docker-compose up
启动测试, 日志输出如下:
Creating network "rsyslog_default" with the default driver Creating rsyslog_rsyslog_1 ... done Creating rsyslog_logapp_1 ... done Attaching to rsyslog_rsyslog_1, rsyslog_logapp_1 logapp_1 | WARNING: no logs are available with the 'syslog' log driver rsyslog_1 | rsyslog appliance version 2018-06-26 (1530020232) - http://www.syslogappliance.de rsyslog_1 | Copyright (C) 2018 by Rainer Gerhards and Adiscon GmbH - released under ASL 2.0 rsyslog_1 | rsyslog_1 | WARNING: this is an experimental container - do not use in production rsyslog_1 | rsyslog_1 | Using rsyslog configuration file: /etc/rsyslog.conf rsyslog_1 | ENABLE_LOGSENE=off rsyslog_1 | RSYSLOG_CONF=/etc/rsyslog.conf rsyslog_1 | LOGFILES_STORE=/logs/hosts/%hostname:::secpath-replace%/messages.log rsyslog_1 | HOSTNAME=6d034357ccb0 rsyslog_1 | SHLVL=1 rsyslog_1 | HOME=/root rsyslog_1 | CNF_CALL_LOG_TO_LOGFILES=call log_to_files rsyslog_1 | CNF_CALL_LOG_TO_LOGSENE= rsyslog_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin rsyslog_1 | ENABLE_STATISTICS=on rsyslog_1 | PWD=/home/appliance rsyslog_1 | ENABLE_LOGFILES=on rsyslog_1 | TZ=UTC rsyslog_1 | rsyslogd 8.36.0: running as pid 1, enabling container-specific defaults, press ctl-c to terminate rsyslog rsyslog_1 | 2019-05-01T15:15:22.330709+00:00 6d034357ccb0 rsyslogd: [origin software="rsyslogd" swVersion="8.36.0" x-pid="1" x-info="http://www.rsyslog.com"] start
日志中重点是 logapp_1 | WARNING: no logs are available with the 'syslog' log driver 提示 logapp 的日志不再输出到docker标准console中了,所以看不到容器的 hello 输出。
可以注释logging部分,对比一下日志输出。
在 rsyslog 挂载的数据卷目录 logs 中看到生成了一系列日志:
➜ logs tree -L 3 . ├── debug └── hosts ├── 6d034357ccb0 │ └── messages.log ├── e5281045a174 │ └── messages.log └── localhost └── messages.log
其中localhost/messages.log
信息如下:
2019-05-01T15:15:23+00:00 localhost app[1478]: hello 2019-05-01T15:15:33+00:00 localhost app[1478]: hello 2019-05-01T15:15:43+00:00 localhost app[1478]: hello 2019-05-01T15:15:53+00:00 localhost app[1478]: hello ...
可见 logapp 的日志使用tcp传输到 rsyslog 中,并由后者写入文件。
在官方的说明中,可以在 daemon.json
中定义,统一替换docker日志驱动:
{ "log-driver": "syslog", "log-opts": { "syslog-address": "udp://1.2.3.4:1111" } }
也可以对单个容器使用 --log-driver 参数自定义更换,命令如下:
docker run \ -–log-driver syslog –-log-opt syslog-address=udp://1.2.3.4:1111 \ alpine echo hello world
当然,如果了解 compose ,推荐使用本文的方式替换,会更便捷。至于 rsyslog 的配置,比较复杂,请直接查看参考链接。
清理
使用 Ctrl
+ C
结束容器后,在使用 docker-compose down
将测试容器及网络清理。