ELK
“ELK”是三個開源項目的首字母縮寫,這三個項目分別是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一個搜索和分析引擎。Logstash 是服務(wù)器端數(shù)據(jù)處理管道,能夠同時從多個來源采集數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù),然后將數(shù)據(jù)發(fā)送到諸如 Elasticsearch 等“存儲庫”中。Kibana 則可以讓用戶在 Elasticsearch 中使用圖形和圖表對數(shù)據(jù)進(jìn)行可視化。
Elasticsearch,則在NOSQL中已經(jīng)做了詳細(xì)的解釋說明,并提供了單點集群,和多點集群的搭建方式。具體的內(nèi)容可查看中間件文集中。以下從Logstash 開始談起。
1. Logstash
Logstash 是一個開源的數(shù)據(jù)收集引擎,可以收集不同地方的數(shù)據(jù)。以下是借用官網(wǎng)的說明:
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.

1.1 工作原理
Logstash 的時間處理分為三個階段:輸入->過濾器->輸出。

輸入:支持多種的輸入,例如:文件、TCP、UDP、HTPP、Redis、Kafka、log4j、websocket 、JDBC等等。
輸出:同樣支持多個格式,例如:文件、CSV、email、Kafka、ElasticSearch、http、Redis、mongodb、websocket 等等。
過濾:一般不需要,詳細(xì)可查閱官網(wǎng)。
最后選擇ElasticSearch做數(shù)據(jù)的輸出端因為它具備以下功能:
- 支持高并發(fā)
- 支持海里的數(shù)據(jù)查詢
- 與Kibana 結(jié)合設(shè)置過期策略
- 全文索引
1.2 日志的拉取
日志的拉取模式一般用于第三方的服務(wù)上面,例如:mysql,nginx,等等。
實現(xiàn)方式:修改配置文件,在配置文件中添加日志的路徑。
文件類型:可以收集多個不同的文件夾下的文件,服務(wù)器宕機(jī)后重新的打開也不會重復(fù)收集。
以下為: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文件夾掛載出來。
- 掛載文件夾的權(quán)限是777。
然后在Kibana 中創(chuàng)建模板查看。
1.3 程序的推送
程序的推送效率高,這個模式是Logstash提供了一個長連接的端口。
實現(xiàn)方式:修改配置文件.
以下為:tcp.conf
input {
tcp{
port => 9600
type => "TcpLog"
}
}
output {
elasticsearch {
hosts => ["IP:9200"]
index => "tcplog"
}
}
缺點:在高并發(fā)的時候?qū)ogstash的壓力比較大,所以就有了下面的兩種方式,先緩存到redis 或是kafka中,然后在到Logstash中。
1.4 Redis
這個模式是Logstash主動的去連接Redis去獲取數(shù)據(jù)。
實現(xiàn)方式:修改配置文件.
以下為: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當(dāng)把Redis中數(shù)據(jù)收集完成后,會刪除Redis中收集過的數(shù)據(jù),防止Redis宕機(jī)后,重復(fù)收集。
1.5 Kafka
這個模式是Logstash主動的去連接Kafka去獲取數(shù)據(jù)。
實現(xiàn)方式:修改配置文件.
以下為:kafka.conf
input {
kafka {
topics => "kafkalog"
bootstrap_servers => "IP:9092" # 從kafka的leader主機(jī)上提取緩存
codec => "json" # 在提取kafka主機(jī)的日志時,需要寫成json格式
}
}
output {
elasticsearch {
hosts => ["IP:9200"]
index => "kafkalog"
}
}