Docker日志解决方案(rsyslog+logstash)

测试环境

Host OS IP Services
syslog服务器 Ubuntu16.04 192.168.3.48 rsyslog,logstash
docker服务器 Ubuntu16.04 192.168.3.45 nginx

docker服务器启动nginx容器,nginx容器日志通过syslog传到syslog服务器,syslog服务器把日志输出到logstash中。


Syslog日志服务器配置

修改rsyslog配置文件/etc/rsyslog.conf,取消TCP或者UDP日志接收模块注释,下图开启TCP514端口接收日志

root@192.168.3.48:~# vi /etc/rsyslog.conf

创建日志转发模板文件/etc/rsyslog.d/01-template-json.conf,使用json格式进行日志转发

root@192.168.3.48:~# touch /etc/rsyslog.d/01-template-json.conf

输入以下文件内容吗,定义syslogjson模板及各个字段,更多字段内容

template(name="json-template"
  type="list") {

    constant(value="{")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"@version\":\"1")
      constant(value="\",\"message\":\"")     property(name="msg" format="json")
      constant(value="\",\"sysloghost\":\"")  property(name="hostname")
      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
      constant(value="\",\"programname\":\"") property(name="programname")
      constant(value="\",\"procid\":\"")      property(name="procid")
    constant(value="\"}\n")
}

创建日志转发配置文件/etc/rsyslog.d/60-output.conf

root@192.168.3.48:~# touch /etc/rsyslog.d/60-output.conf

输入以下内容,定义所有日志使用json-template模板转发到192.168.3.48:105142个@@表示TCP端口,1个@表示UDP端口

# This line sends all lines to defined IP address at port 10514,
# using the "json-template" format template

*.*                         @@192.168.3.48:10514;json-template

重启rsyslog服务

root@192.168.3.48:~# /etc/init.d/rsyslog restart


Docker服务器配置syslog驱动

为docker daemon配置syslog驱动,并设置远程syslog日志服务器地址和端口接收日志

root@192.168.3.45:~# dockerd start --log-driver=syslog \
--log-opt syslog-address=tcp://192.168.3.48:514 &

或者启动容器时配置syslog中心服务器记录日志(不建议使用该方式)

root@192.168.3.45:~# docker run --log-driver=syslog \
--log-opt syslog-address=tcp://192.168.3.48:514

启动nginx容器,访问nginx容器

root@192.168.3.45:~# docker run -it --rm -p 80:80 nginx
root@192.168.3.45:~# curl 192.168.3.45

查看容器,输出了nginx访问日志

查看syslog服务器日志,确定接收到nginx容器日志

root@192.168.3.48:~# cat /var/log/syslog


logstash配置(容器方式)

logstash容器运行在syslog服务器上,下载logstash镜像,创建logstash配置文件

root@192.168.3.48:~# docker pull logstash
root@192.168.3.48:~# cd ~ 
root@192.168.3.48:~# mkdir logstash_pipeline
root@192.168.3.48:~# vi logstash_pipeline/logstash.conf

定义logstash输入输出与过滤条件,输入从tcp10514端口接受日志数据(也可以直接读取syslog采集,但需要对syslog文件有读权限),直接输出到标准输出,更多配置参考

input {
  tcp {
    port => 10514
    codec => "json"
    type => "rsyslog"
  }
#    file { 
#       path => "/logs/syslog" 
#       start_position => "beginning"
#    }
# stdin { }
}

filter { }

output {
    stdout { }
}

启动logstash容器,接收syslog日志

root@192.168.3.48:~# docker run -it --rm -p 192.168.3.48:10514:10514 -v ~/logstash_pipeline/:/logstash_pipeline logstash -f /logstash_pipeline/logstash.conf

查看logstash容器输出,成功接收到syslog日志。数据流向nginx容器-->syslog服务器-->logstash容器