ELK搭建
ELK
“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
Elasticsearch,则在NOSQL中已经做了详细的解释说明,并提供了单点集群,和多点集群的搭建方式。具体的内容可查看中间件文集中。以下从Logstash 开始谈起。
1. Logstash
Logstash 是一个开源的数据收集引擎,可以收集不同地方的数据。以下是借用官网的说明:
Logstash is an open source data collection engine with real-time pipelining capabilities. Logstash can dynamically unify data from disparate sources and normalize the data into destinations of your choice. Cleanse and democratize all your data for diverse advanced downstream analytics and visualization use cases.
While Logstash originally drove innovation in log collection, its capabilities extend well beyond that use case. Any type of event can be enriched and transformed with a broad array of input, filter, and output plugins, with many native codecs further simplifying the ingestion process. Logstash accelerates your insights by harnessing a greater volume and variety of data.
9.png
1.1 工作原理
Logstash 的时间处理分为三个阶段:输入->过滤器->输出。
10.png
输入:支持多种的输入,例如:文件、TCP、UDP、HTPP、Redis、Kafka、log4j、websocket 、JDBC等等。
输出:同样支持多个格式,例如:文件、CSV、email、Kafka、ElasticSearch、http、Redis、mongodb、websocket 等等。
过滤:一般不需要,详细可查阅官网。
最后选择ElasticSearch做数据的输出端因为它具备以下功能:
- 支持高并发
- 支持海里的数据查询
- 与Kibana 结合设置过期策略
- 全文索引
1.2 日志的拉取
日志的拉取模式一般用于第三方的服务上面,例如:mysql,nginx,等等。
实现方式:修改配置文件,在配置文件中添加日志的路径。
文件类型:可以收集多个不同的文件夹下的文件,服务器宕机后重新的打开也不会重复收集。
以下为:logstash.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
file {
path => "/home/public/*log.log"
start_position => beginning
}
file {
path => "/home/public/*log.text"
start_position => beginning
}
}
output {
elasticsearch {
hosts => ["IP:9200"]
#索引名称小写
index => "filelog"
#user => "elastic"
#password => "123456"
}
}
启动方式:以docker 为例子,以下的所有启动方式可参考。
logstash.yml 文件,注意它是连接elasticsearch的文件。
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://IP:9200" ]
docker 启动命令:
docker run --rm -it --privileged=true -p 9600:9600 -d -v /logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -v /logstash/log/:/home/public/ -v /logstash/logstash.yml:/usr/share/logstash/config/logstash.yml logstash:7.2.0
注意:
- 要把log文件夹挂载出来。
- 挂载文件夹的权限是777。
然后在Kibana 中创建模板查看。
1.3 程序的推送
程序的推送效率高,这个模式是Logstash提供了一个长连接的端口。
实现方式:修改配置文件.
以下为:tcp.conf
input {
tcp{
port => 9600
type => "TcpLog"
}
}
output {
elasticsearch {
hosts => ["IP:9200"]
index => "tcplog"
}
}
缺点:在高并发的时候对Logstash的压力比较大,所以就有了下面的两种方式,先缓存到redis 或是kafka中,然后在到Logstash中。
1.4 Redis
这个模式是Logstash主动的去连接Redis去获取数据。
实现方式:修改配置文件.
以下为:redis.conf
input {
redis {
codec => plain
host => "IP"
port => 6379
data_type => list
key => "listlog"
db => 0
}
}
output {
elasticsearch {
hosts => ["IP:9200"]
index => "redislog"
}
}
注意:Logstash当把Redis中数据收集完成后,会删除Redis中收集过的数据,防止Redis宕机后,重复收集。
1.5 Kafka
这个模式是Logstash主动的去连接Kafka去获取数据。
实现方式:修改配置文件.
以下为:kafka.conf
input {
kafka {
topics => "kafkalog"
bootstrap_servers => "IP:9092" # 从kafka的leader主机上提取缓存
codec => "json" # 在提取kafka主机的日志时,需要写成json格式
}
}
output {
elasticsearch {
hosts => ["IP:9200"]
index => "kafkalog"
}
}