使用docker-compose快速搭建ELK日志分析系统

目录

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

ELK是一个非常常用的日志收集系统,它是由elasticsearch,logstash,kibana组成。本文通过docker-compose来快速搭建起一个ELK日志栈,使用了最简化的配置,可以立即用于开发环境或测试环境。如果用于生产环境的日志收集和分析,还需要进一步的完善。

首先简单了解一下ELK框架的概览,可通过下图来说明:
“ELK Stack”

  • ElasticSearch:有强大的搜索功能的无模式数据库,可以简单的横向扩展,索引每一个字段,可以聚合分组数据,索引收集的日志数据并使它更易于查询。
  • Logstash:一个用于读取原始日志的工具,然后对日志进行分析和过滤,最后可以将其发送到另外一个服务,如索引或者存储系统,这里它将数据发送到ElasticSearch中。
  • Kibana:一个基于JavaScript的关于Elasticsearch的图形化接口。它可以用来运行Elasticsearch的查询,并且将结果以各种图表的方式可视化。支持Lucene的查询字符串的语法和Elasticsearch的过滤功能。

下面就来进行ELK栈的搭建。所用的环境机器名为centos7,ip地址为192.168.71.131。
我们首先进行logstash配置文件的编写,如下:

logstash.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
input {
tcp {
port => 5000
codec => json
}
udp {
port => 5000
codec => json
}
}
output {
elasticsearch { hosts => [ "elasticsearch:9200" ] }
}

在上面的配置文件中,input部分配置logstash的input plugin,这里设置为在tcp和udp端口5000进行监听。logstash支持多种input插件,可以通过这些插件收集不同数据源的日志。详细信息参考Input plugins
类似的,output部分配置其output plugin,这里设置将数据发送到elasticsearch进行进一步处理。详细信息参考output plugin.
还可以在配置文件中配置Filter plugins,以便对于原始的日志数据进行过滤。这里没有配置filter部分。关于logstash配置文件的完整说明可以参考官方文档
完成了logstash的配置文件,下一步就可以编写ELK的docker-compose的配置文件了:

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
logstash:
image: logstash:5.0.1
volumes:
- ./logstash.conf:/etc/logstash.conf
environment:
LOGSPOUT: ignore
ports:
- "5000:5000/tcp"
- "5000:5000/udp"
links:
- elasticsearch
command: -f /etc/logstash.conf
elasticsearch:
image: elasticsearch:5.0.1
environment:
LOGSPOUT: ignore
kibana:
image: kibana:5.0.1
environment:
LOGSPOUT: ignore
ELASTICSEARCH_URL: http://elasticsearch:9200
links:
- elasticsearch
ports:
- "5601:5601"

在启动此compose file之前,需要将主机的vm.max_map_count值调高(链接),命令如下:

[yangdong@centos7 ~]$ sudo sysctl -w vm.max_map_count=262144
[sudo] password for yangdong: 
vm.max_map_count = 262144

然后在docker-compose.yml和logstash.conf所在的文件夹下启动docker-compose:

[yangdong@centos7 logging]$ docker-compose up
...

观察程序的日志输出,确认启动正常,这样我们的ELK栈就快速搭建成功了。

目前只是搭建了ELK栈,还没有日志传输到logstash上面,下面就使用上篇文章“通过Logspout路由docker容器日志”中构建的logspout来将另外一台主机上的docker日志发送到logstash上。这个主机的机器名为centos7-A,ip地址为192.168.71.167。整个架构如下图所示:
“Container logging with Logspout and ELK”
通过如下命令启动logspout容器:

[yangdong@centos7-A ~]$ docker run -d --name="logspout" \
--volume=/var/run/docker.sock:/var/run/docker.sock \
-e ROUTE_URIS=logstash+tcp://192.168.71.131:5000 \
registry.cn-beijing.aliyuncs.com/andyyoung01/logspout-logstash

这样,整个centos7-A机器上的docker日志都能收集到ELK所在的机器上了。类似的,如果有多台docker主机,都可以在其主机上运行此命令来将日志集中收集到ELK机器上。

本篇通过docker-compose快速搭建了ELK日志栈,没有考虑生产环境中可能遇到的各种情况。如果要搭建ELK日志分析系统的生产环境,或者需要保存一定时间长度的日志,需要考虑使用docker中的volume来将数据保存到特定位置,也可以通过搭建elasticsearch集群的方式进行扩展。