Logspout+ELK 集中收集docker日志
一、解决的问题
- 业务中存在多台服务器。每台服务器也有多个docker容器服务,每一个容器一份日志,这导致日志十分分散。
- ELK很好得解决了这个问题,部署一套ELk(elasticsearch,logstash,kibana)系统,elasticsearch负责存储日志,logstash负责接收处理日志,并将日志存至elasticsearch,
kibana连接elasticsearch,可视化日志。每台服务器部署logspout,logspout则会收集这台服务器上的每一个容器日志,同时将日志传输到远程的logstash上。
基本思路通过logstash获取docker中的日志,然后,将日志转发给elasticsearch进行索引,kibana分析和可视化。
获取docker中的日志文件可以有多种方式:
- 1、添加一个MQ或者Redis作为docker容器和logstash的中间层,docker中的服务将日志传输到中间层,然后,logstash从中间获取
- 2、使用工具获取docker中的日志,例如:filebeat,logspout,log-pilot;但是不建议在每个服务器上安装logstash,因为logstash运行会占有大量的服务器资源,增加服务器压力。
- filebeat的配置好像相对比较复杂,没有具体了解;
- logspout 可以获取docker的stdout日志
- log-pilot 是阿里开源的日志工具,可以处理stdout和日志文件
二、Docker安装ELK
1、 编辑文件 config/logstash.conf(配置输入输出)
input {
udp {
port => 5000
type => json
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200" #将logstash的输出到 elasticsearch ,修改成你部署的elasticsearch服务
}
}
1.1 编辑/config/logstash.yml
path.config: /usr/share/logstash/conf.d/*.conf
path.logs: /var/log/logstash
2、编写一下 Docker-compose.yml 方便构建
version: '3'
services:
elasticsearch:
image: elasticsearch:7.1.1
environment:
- discovery.type=single-node
ports:
- "9200:9200"
- "9300:9300"
logstash:
image: logstash:7.1.1
volumes:
- /data/ELK/config:/usr/share/logstash/conf.d/
- /data/ELK/config/logstash.yml:/usr/share/logstash/config/logstash.yml
ports:
- "5001:5000"
links:
- elasticsearch
kibana:
image: kibana:7.1.1
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200 //注意修改成你部署的elasticsearch服务
ports:
- "5601:5601"
links:
- elasticsearch
3、docker-compose up --build -d 命令开启部署
三、访问kibana http://ip:5601(kibana服务ip)
1、Create index pattern
创建index后,即可查看日志
Docker启动elasticsearch闪退,无法创建的问题解决
由于官方的elasticsearch 镜像缺少配置,需要配置两处地方
- 修改max_map_count大小
sysctl -w vm.max_map_count=262144
- 修改elasticsearch.yml配置文件
//找到文件
cd /var/lib/docker/overlay2/
find . -name "elasticsearch.yml"
//在文件中添加
bootstrap.system_call_filter: false
cluster.initial_master_nodes: ["node-1"]