Elasticsearch
分布式搜索和分析引擎。具有高可伸縮、高可靠和易管理等特點。基于 Apache Lucene 構建,能對大容量的數據進行接近實時的存儲、搜索和分析操作。
Logstash
日志收集器。搜集各種數據源,并對數據進行過濾、分析、格式化等操作,然后存儲到 Elasticsearch。
Kibana
數據分析和可視化平臺。與 Elasticsearch 配合使用,對其中數據進行搜索、分析、圖表展示。
Filebeat
一個輕量級開源日志文件數據搜集器,Filebeat 讀取文件內容,發送到 Logstash 進行解析后進入 Elasticsearch,或直接發送到 Elasticsearch 進行集中式存儲和分析。
架構介紹
基于ELK的使用方式,Logstash 作為日志搜集器,Elasticsearch 進行日志存儲,Kibana作為日志呈現,大致以下幾種架構。
架構一
圖中 Logstash 多個的原因是考慮到程序是分布式架構的情況,每臺機器都需要部署一個 Logstash,如果確實是單服務器的情況部署一個 Logstash 即可。
前面提到 Logstash 會對數據進行分析、過濾、格式化等操作,這一系列操作對服務器的 CPU 和內存資源的消耗都是比較高的,所以這種架構會影響每臺服務器的性能,所以并不推薦采用。
架構二
相比于架構一,增加了一個MQ 和 Logstash, Logstash 的輸出和輸入支持 Kafka、Redis、RabbitMQ 等常見消息隊列, MQ 前的 Logstash 只作為日志收集和傳輸,并不解析和過濾,先將日志加入隊列,由 MQ 后面的
Logstash 繼續解析和過濾,這樣就不至于每臺服務器消耗資源都很多。
架構三
這種架構是基于架構二簡化來的,實際在使用過程中也是可以采取的,日志直接進入 MQ,Logstash 消費 MQ 數據即可。
架構四
這種架構在日志數據源和 Logstash(或 Elasticsearch) 中增加了 Beats 。Beats 集合了多種單一用途數據采集器,每款采集器都是以用于轉發數據的通用庫 libbeat 為基石,beat 所占的系統CPU和內存幾乎可以忽略不計,libbeat平臺還提供了檢測機制,當下游服務器負載高或網絡擁堵時,會自動降低發生速率。下面的例子我們使用 Filebeat 來對文件日志的收集,其他的 beat 可以忽略。
架構四相比于架構二,如果將每臺服務器上部署的 Logstash 都換成對應的 Beats ,那就是更理想的架構了。
不管怎么樣,對于日志解析和過濾的 Logstash 資源消耗還是比較高的,所以如果需要,可以將 Logstash 的部署使用分布式,Elasticsearch 的部署使用集群來強化整個日志系統。
部署
部署之前需要安裝好JDK,Java 8 版本。然后官方下載對應操作系統的安裝包,如果采用Docker部署,直接使用提供的鏡像即可。
下載包解壓后就可以直接啟動了。
Logstash
bin/logstash -f logstash.conf # logstash.conf是需要自己創建的日志處理配置文件
配置文件的基本格式如下:
# 輸入
input {
}
# 分析、過濾
filter {
}
# 輸出
output {
}
Elasticsearch
bin/elasticsearch
啟動的時候如果出現不允許root啟動,那創建一個新用戶:
- 創建用戶組
groupadd elsearch
- 創建用戶
useradd elsearch -g elsearch -p elsearch
- 切到root用戶,修改 elsearch 用戶組下的 elsearch 用戶對 elasticsearch 文件夾(解壓出的的elasticsearch目錄)的權限
chown -R elsearch:elsearch elasticsearch
- 切到elsearch用戶,重啟 elasticsearch
Kibana
bin/kibana
Filebeat
filebeat -e -c filebeat.yml
filebeat.yml 關鍵配置,所有/var/log/的.log文件的日志都會輸出到 Logstash 的 5044 端口
filebeat.prospectors:
- input_type: log
paths:
- /var/log/*.log
output.logstash:
hosts: ["localhost:5044"]
Logstash 例子:
配置文件內容:
input {
beats {
port => 5044
codec => "json"
}
}
filter{
if [logtype] {
mutate { replace => { type => "%{logtype}" }}
}else{
mutate { replace => { type => 'unknow' }}
}
date {
match => [ "createTime" , "yyyy-MM-dd HH:mm:ss" ]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
配置文件說明:
使用 Filebeat 作為 Logstash 的輸入(輸入輸出可以有多種方式,不太了解的可以先寫看看官方文檔),Logstash 監聽了 5044 端口。這個例子中對接收到的日志進行 json 格式化,如果 json 中包含 logtype,我們把日志的
type 設置成 logtype,如果不包含,設置成 unknow,然后把日志中的
createTime 格式化成 yyyy-MM-dd HH:mm:ss 的時間格式。最后輸出到 elasticsearch,index 是 elasticsearch 的索引名稱,我們根據不同的 type 創建不同的索引。