随着业务发展越来越庞大,服务器越来越多,各种访问日志、应用日志、错误日志量越来越多,开发人员排查问题,需要到服务器上查日志,不方便。运营人员需要一些数据,需要我们运维到服务器上分析日志。
ELK是 ElasticSearch、 Logstash 、 Kibana的简称,主要用于解决日志的采集、分析、存储、查看问题。也有人称为EFK,即 ElasticSearch、 FileBeat 、 Kibana,还有人称为Elastic Stack。
ElasticSearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据
FileBeat主要有两部分组成:inputs、harvester 。完成将指定文件的数据传输到指定的服务器上。
harvester负责一行行读取每个文件的内容,并读取内容输出。每个文件启动一个harvester。harvester负责打开和关闭文件。如果在读取文件的过程中,文件被重命名,FileBeat会继续读取文件内容。如果在harvester仍在读取文件时文件被删除,则关闭文件句柄,释放底层资源。
input 负责管理harvester,并且配置需要读取的文件路径。
FileBeat保存每个文件的状态并频繁的记录到磁盘的注册文件中,该状态记录每个日志的读取的偏移量,并确保发送的日志行。如果输出无法访问,FileBeat会跟踪最后一次的发送行,并在输出可用时继续读取文件。在FileBeat运行过程中,内存会保存每个文件的状态,并在FileBeat重启后,根据磁盘注册文件记录的数据,重建文件状态。由于文件可能会被重命名或者移动,对于每个文件,FileBeat存储一个唯一标识符,检测文件是否被采集过。
FileBeat保证事件至少会传输到配置的输出一次,数据不会丢失。在输出阻塞或者未确认所有事件的情况下,FileBeat将继续尝试发送事件,直到接收端确认收到。发送到输出端,但是未等到接收端确认时关闭FileBeat,FileBeat在下次启动后,会重新发送。这样可以确保事件至少发送一次,但是接收端可能接收到多次输出。
Logstash 事件处理分三个阶段 input —> filter —> output
监听输入端口,输入数据到logstash
常用的类型有:
1)、文件
2)、syslog
3)、redis
4)、kafka
5)、beats
数据中间处理,对数据进行操作。
grok 解析任意文本数据,是logstash一个插件,主要作用是将字符串格式的文本,转换成具体的结构化数据,配合正则表达式使用。
将解析的结构化文本数据存储。
logstash作为采集和分析,需要安装在应用服务器上,比较占用资源,在日志量比较大的时候,可能对服务器上的其他应用有影响。
因为logstash比较占用资源,这里做了优化,filebeat采集日志,logstash 解析过滤日志。filebeat占用资源比较少,对服务器上其他应用不会有很大资源竞争,logstash可以单独部署。
当采集的日志数据量比较大,logstash日志处理任务比较重,可能会有日志积压,添加kafka或者redis作日志缓存。
jdk:1.8.0_191
filebeat:filebeat-6.8.2-linux-x86_64.tar.gz
logstash:logstash-6.8.2.tar.gz
elasticsearch:elasticsearch-6.8.2.tar.gz
kibana:kibana-6.8.2-linux-x86_64.tar.gz
服务器IP | filebeat | logstash | elasticsearch | kibana |
---|---|---|---|---|
192.168.100.01 | 安装(主节点) | 安装 | ||
192.168.100.02 | 安装 | 安装(从节点) | ||
192.168.100.03 | 安装(从节点) | |||
192.168.100.04 | 安装 |
参考 技术分享文档 -> ElasticSearch 6.3.x安装
tar -zxvf kibana-6.8.2-linux-x86_64.tar.gz
ln -s kibana-6.8.2-linux-x86_64 kibana
chown -R work:users kibana-6.8.2-linux-x86_64
chown -R work:users kibana
cd /data/software/kibana/config
vi ./kibana.yml
server.port: 5601
server.host: "192.168.100.01"
elasticsearch.hosts: ["http://192.168.100.01:9200"]
nohup /data/soft/kibana/kibana &
tar -zxvf filebeat-6.8.2-linux-x86_64.tar.gz
ln -s filebeat-6.8.2-linux-x86_64 filebeat
chown -R work:users filebeat-6.8.2-linux-x86_64
chown -R work:users filebeat
修改配置
cd /data/software/filebeat/
vi ./kibana.yml
- type: log
enabled: true
paths:
指定需要采集的文件(同一层级模糊匹配,不能子文件递归)
- /data/logs/*.log
日志合并行,正则表达式匹配日志的开头行或者日志中需要合并到前面日志的行,例如日志开头为日期2019-08-10,我们可以配置如下:
Multiline.pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}
或者日志为[warn],我们可以这样配置:
Multiline.pattern: ^\[
配置日志规则匹配的行,如果正则匹配的是首行就为false,如果是后面的行和首行合并,就为true。具体看正则规则
multiline.negate: false
合并的日志是追加到前面日志的前面还是后面,我们这里为after
multiline.match: after
日志输出,可以选择elasticsearch,logstash, console中的一种,这里采用logstash
去掉output.logstash:前面的#
hosts: ["192.168.100.02:5040"]
保存
后台启动
nohup /data/soft/filebeat/filebeat -e -c /data/soft/filebeat/filebeat.yml &
tar -zxvf logstash-6.8.2.tar.gz
ln -s logstash-6.8.2.tar.gz logstash
chown -R work:users logstash-6.8.2.tar.gz
chown -R work:users logstash
mkdir conf.d
cd /data/software/logstash/conf.d
touch test.yml
vi ./test.yml
input{
beats{
port=>5040
}
}
filter{
if [fields][logtype] in ["icrm-prod-catalina", "icrm-prod-localhost", "icrm-prod-localhost_access", "icrm-prod-o2oapi", "icrm-prod-o2otask", "icrm-prod-rest", "icrm-prod-catalina-daemo
n"]{
grok{
match => [ "message", "%{TIMESTAMP_ISO8601:logdate}" ]
}
date{
match => ["logdate", "YYYY-MM-dd HH:mm:ss,SSS"]
}
}
}
output{
elasticsearch{
hosts: ["192.168.200.01:9200"]
index: "teset-%{+YYYY-MM-dd}"
}
}
nohup /data/soft/logstash/bin/logstash --path.settings /data/soft/logstash/config -f /data/software/logstash/conf.d &