1.为什么需要集中查看服务日志
当服务出现错误的时候,需要到服务器上查看错误的日志,而服务器上的服务会运行多个实例。这样就需要登录到每个实例的容器中查看相应的日志,而且如果不是程序服务出的问题,还需要到每个数据库的实例容器中查看日志,这样做会比较繁琐。
2.集中查看服务日志的组件
有一组组件是ELK组件,可以配合实现集中查看服务日志。E指的是Elasticsearch,他是一个很好的实时存储数据并且高效查询数据的数据库,主要用他存储集群服务中产生的日志并且能够实时查询;L指的是Logstash,允许我们中心化处理数据,可以对数据进行各种格式化处理;K指的是Kibana,可以与Elasticsearch相结合,能进行图形化的日志查看、搜索等。
3.在docker集群中搭建ELK
3.1 搭建elasticsearch的服务
docker service create \
--name elasticsearch \
--network elk \
-p 9200:9200 \
--reserve-memory 500m \
elasticsearch:2.4
3.2 搭建logstash的服务
先建立一个简单的logstash服务的配置文件,logstash.conf(主要是让logstash监听在51415端口,把日志输出到elasticsearch中):
input {
syslog { port => 51415 }
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
}
}
以及建立logstash服务:
docker service create --name logstash \
--mount "type=bind,source=$PWD/docker/logstash,target=/conf" \
--network elk \
-e LOGSPOUT=ignore \
--reserve-memory 100m \
logstash:2.4 logstash -f /conf/logstash.conf
但是有个问题如何让其他服务日志输出到logstash呢,可以通过logspout的服务,将其他服务的日志输出到logstash中。logspout需要其他服务在stdout上输出日志才能将日志重定向,这就需要你的其他服务通过重定向文件输出到stdout的方式来实现输出日志到stdout,logsout搭建如下:
docker service create --name logspout \
--network elk \
--mode global \
--mount "type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock" \
-e SYSLOG_FORMAT=rfc3164 \
gliderlabs/logspout syslog://logstash:51415
logsout的工作原理是,他在每台节点启动 ,所以--mode global;通过docker的socket来获取每个服务中日志的输出,然后将日志内容重定向到logstash服务
3.3基于之前的swarm listener搭建kibana
docker service create --name kibana \
--network elk \
--network proxy \
-e ELASTICSEARCH_URL=http://elasticsearch:9200 \
--reserve-memory 50m \
--label com.df.notify=true \
--label com.df.distribute=true \
--label com.df.servicePath=/app/kibana,/bundles,/elasticsearch \
--label com.df.port=5601 \
kibana:4.6
搭建的kibana可以通过三种url方式打开/app/kibana、/bundles、/elasticsearch