Elastic Stack简介
Elastic Stack是Elastic公司旗下的一系列软件总称,包括Elasticsearch、Logstash、Kibana和Beats。Elasticsearch是一个分布式搜索引擎,负责数据的存储、查询,支持高并发的写入与查询;Logstash是动态数据收集管道,可以进行数据的清洗、格式化等处理;Kibana是基于Elasticsearch的数据可视化平台,提供种类丰富的图表来呈现数据;Beats通常部署在生产环境下,扫描日志文件并向Elasticsearch或Logstash发送数据,在本文中我们使用FileBeat。
Elastic Stack的应用非常广泛,常见的有日志管理与分析、指标分析、性能监测、应用搜索等。本篇文章中我们借助腾讯云的Elasticsearch、使用Elastic Stack搭建自动化流转过程的监控与统计系统。
准备工作
- 日志消息协议
前边提到,Logstash是可以进行数据处理的,所以对于日志文件的格式并没有要求,只需要后期在Logstash处借助grok进行格式化即可。方便起见,在本次使用中我们统一了日志消息协议,并统一使用json格式单独存储,因此省去了Logstash处的格式化操作。
为我们定义的日志协议,其中log_type字段用于在Elasticsearch中建立索引(相当于我们熟悉的数据表),phase、finish_time是我们后期监控与统计主要的划分维度,miles是我们监控的指标。其他的一些字段是我们业务中会使用到的信息,主要用于后期统计使用。
- 日志获取方式
在我们的使用中,日志的产生源有两大类:已完成开发的和正在进行开发的。对于前者,为了避免重新开发带来的工作量,我们采取定时扫库的方式“自给自足”的产生日志消息;对于后者,我们要求开发根据上述日志消息协议生产日志。两种日志都需要通过部署在环境内的FileBeat发送至Logstash,再由Logstash发送至Elasticsearch中。
数据接入
- 日志的准备
以Python为例,将日志消息msg使用fp.write(json.dumps(msg))输出到文件中
- Beats-Logstash-Elasticsearch接入
- Logstash配置(conf)
input {
beats {
port => 8888
codec => "json"
}
}
output {
elasticsearch {
hosts => ["<elasticsearch_ip>:<elasticsearch_port>"]
index => "%{log_type}"
}
stdout {
codec => rubydebug
}
}
上述配置中,Logstash监听本地8888端口、并使用json解码器对消息进行解析。对于解析后的消息,根据消息中的log_type字段发送至Elasticsearch对应的索引中,同时在命令行中输出。
- Logstash启动
./bin/logstash -c logstash.conf(可以使用nohup)
- FileBeat配置(yml)
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/app/wsd_cron_agent/script/logs/*.log
output.logstash:
hosts: ["<logstash_ip>:<logstash_port>"]
上述配置中,FileBeat定时扫描/usr/local/app/wsd_cron_agent/script/logs/路径下的log文件,发送至远端的Logstash处。
- FileBeat启动
./filebeat -e -c filebeat.yml(可以使用nohup)
接下来FileBeat和Logstash就会自动将路径下的日志文件传输至Elasticsearch了。
Kibana可视化
对于第一次接入的数据,首先要做的是创建索引,操作方法是[Management]->[Index Patterns]->[Create Index Pattern]->Index pattern中输入索引名->单击[Create]
图2. Kibana建立索引
之后是使用Kibana自带的visualize进行数据的可视化,这里就是根据自身需求进行设置即可。可以在Dashboard中制作一个自定义的监控窗口,可以清楚直接的看到各个自动化流程的运转情况。
图3. 地图中业流转Dashboard
一些需要注意的问题 & 可以改进的地方
总的来说,Elastic Stack搭建日志分析系统是非常简单、方便的,不过需要注意以下几点:
- Elasticsearch是一种非关系型数据库,不能做连表查询操作,因此必须将所有信息都放在一条消息/一例数据中
- 请避免重复日志消息的产生
- 目前得到的消息是腾讯云在和Elastic官方谈合作,之后会有一些插件(如报警功能)加入,使得监控和分析功能更加强大
- 由于之前没有接触过Elastic Stack,所以也是磕磕碰碰的做了一些尝试,一些地方为了避免出错做了简化,之后可以再进一步优化以提升性能:
- 需要单独产生日志消息,对于开发不够方便;可以考虑在Logstash出增加grok操作对日志进行格式化后再送入Elasticsearch
- FileBeat和Logstash的负载均衡存在进一步提升的可能