ELK平臺介紹
在搜索ELK資料的時候,發現這篇文章比較好,於是摘抄一小段:
以下內容來自:http://baidu.blog.51cto.com/71938/1676798
日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌瞭解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以瞭解服務器的負荷,性能安全性,從而及時採取措施糾正錯誤。
通常,日誌被分散的儲存不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日誌。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日誌管理,例如:開源的syslog,將所有服務器上的日誌收集彙總。
集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
開源實時日誌分析ELK平臺能夠完美的解決我們上述的問題,ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成。官方網站:https://www.elastic.co/products
-
Elasticsearch是個開源分佈式搜索引擎,它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
-
Logstash是一個完全開源的工具,他可以對你的日誌進行收集、過濾,並將其存儲供以後使用(如,搜索)。
-
Kibana 也是一個開源和免費的工具,它Kibana可以爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,可以幫助您彙總、分析和搜索重要數據日誌。
----------------------------摘抄內容結束-------------------------------
畫了一個ELK工作的原理圖:
如圖:Logstash收集AppServer產生的Log,並存放到ElasticSearch集羣中,而Kibana則從ES集羣中查詢數據生成圖表,再返回給Browser。
ELK平臺搭建
系統環境
System: Centos release 6.7 (Final)
ElasticSearch: 2.1.0
Logstash: 2.1.1
Kibana: 4.3.0
Java: openjdk version "1.8.0_65"
注:由於Logstash的運行依賴於Java環境, 而Logstash 1.5以上版本不低於java 1.7,因此推薦使用最新版本的Java。因爲我們只需要Java的運行環境,所以可以只安裝JRE,不過這裏我依然使用JDK,請自行搜索安裝。
ELK下載:https://www.elastic.co/downloads/
ElasticSearch
配置ElasticSearch:
tar -zxvf elasticsearch-2.1.0.tar.gz
cd elasticsearch-2.1.0
安裝Head插件(Optional):
./bin/plugin install mobz/elasticsearch-head
然後編輯ES的配置文件:
vi config/elasticsearch.yml
修改以下配置項:
cluster.name=es_cluster
node.name=node0
path.data=/tmp/elasticsearch/data
path.logs=/tmp/elasticsearch/logs
#當前hostname或IP,我這裏是centos2
network.host=centos2
network.port=9200
其他的選項保持默認,然後啓動ES:
./bin/elasticsearch
可以看到,它跟其他的節點的傳輸端口爲9300,接受HTTP請求的端口爲9200。
使用ctrl+C停止。當然,也可以使用後臺進程的方式啓動ES:
./bin/elasticsearch &
然後可以打開頁面localhost:9200,將會看到以下內容:
返回展示了配置的cluster_name和name,以及安裝的ES的版本等信息。
剛剛安裝的head插件,它是一個用瀏覽器跟ES集羣交互的插件,可以查看集羣狀態、集羣的doc內容、執行搜索和普通的Rest請求等。現在也可以使用它打開localhost:9200/_plugin/head頁面來查看ES集羣狀態:
可以看到,現在,ES集羣中沒有index,也沒有type,因此這兩條是空的。
Logstash
Logstash的功能如下:
其實它就是一個收集器而已,我們需要爲它指定Input和Output(當然Input和Output可以爲多個)。由於我們需要把Java代碼中Log4j的日誌輸出到ElasticSearch中,因此這裏的Input就是Log4j,而Output就是ElasticSearch。
配置Logstash:
tar -zxvf logstash-2.1.1.tar.gz
cd logstash-2.1.1
編寫配置文件(名字和位置可以隨意,這裏我放在config目錄下,取名爲log4j_to_es.conf):
mkdir config
vi config/log4j_to_es.conf
輸入以下內容:
# For detail structure of this file
# Set: https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
input {
# For detail config for log4j as input,
# See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
log4j {
mode => "server"
host => "centos2"
port => 4567
}
}
filter {
#Only matched data are send to output.
}
output {
# For detail config for elasticsearch as output,
# See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
elasticsearch {
action => "index" #The operation on ES
hosts => "centos2:9200" #ElasticSearch host, can be array.
index => "applog" #The index to write data to.
}
}
logstash命令只有2個參數:
因此使用agent來啓動它(使用-f指定配置文件):
./bin/logstash agent -f config/log4j_to_es.conf
到這裏,我們已經可以使用Logstash來收集日誌並保存到ES中了,下面來看看項目代碼。
Java項目
照例先看項目結構圖:
pom.xml,很簡單,只用到了Log4j庫:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
log4j.properties,將Log4j的日誌輸出到SocketAppender,因爲官網是這麼說的:
log4j.rootLogger=INFO,console
# for package com.demo.elk, log would be sent to socket appender.
log4j.logger.com.demo.elk=DEBUG, socket
# appender socket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.Port=4567
log4j.appender.socket.RemoteHost=centos2
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=%d [%-5p] [%l] %m%n
log4j.appender.socket.ReconnectionDelay=10000
# appender console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%l] %m%n
注意:這裏的端口號需要跟Logstash監聽的端口號一致,這裏是4567。
Application.java,使用Log4j的LOGGER打印日誌即可:
package com.demo.elk;
import org.apache.log4j.Logger;
public class Application {
private static final Logger LOGGER = Logger.getLogger(Application.class);
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
LOGGER.error("Info log [" + i + "].");
Thread.sleep(500);
}
}
}
用Head插件查看ES狀態和內容
運行Application.java,先看看console的輸出(當然,這個輸出只是爲了做驗證,不輸出到console也可以的):
再來看看ES的head頁面:
切換到Browser標籤:
單擊某一個文檔(doc),則會展示該文檔的所有信息:
可以看到,除了基礎的message字段是我們的日誌內容,Logstash還爲我們增加了許多字段。而在https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html中也明確說明了這一點:
上面使用了ES的Head插件觀察了ES集羣的狀態和數據,但這只是個簡單的用於跟ES交互的頁面而已,並不能生成報表或者圖表什麼的,接下來使用Kibana來執行搜索並生成圖表。
Kibana
配置Kibana:
tar -zxvf kibana-4.3.0-linux-x86.tar.gz
cd kibana-4.3.0-linux-x86
vi config/kibana.yml
修改以下幾項(由於是單機版的,因此host的值也可以使用localhost來代替,這裏僅僅作爲演示):
server.port: 5601
server.host: “centos2”
elasticsearch.url: http://centos2:9200
kibana.index: “.kibana”
啓動kibana:
./bin/kibana
用瀏覽器打開該地址:
爲了後續使用Kibana,需要配置至少一個Index名字或者Pattern,它用於在分析時確定ES中的Index。這裏我輸入之前配置的Index名字applog,Kibana會自動加載該Index下doc的field,並自動選擇合適的field用於圖標中的時間字段:
點擊Create後,可以看到左側增加了配置的Index名字:
接下來切換到Discover標籤上,注意右上角是查詢的時間範圍,如果沒有查找到數據,那麼你就可能需要調整這個時間範圍了,這裏我選擇Today:
接下來就能看到ES中的數據了:
執行搜索看看呢:
點擊右邊的保存按鈕,保存該查詢爲search_all_logs。接下來去Visualize頁面,點擊新建一個柱狀圖(Vertical Bar Chart),然後選擇剛剛保存的查詢search_all_logs,之後,Kibana將生成類似於下圖的柱狀圖(只有10條日誌,而且是在同一時間段的,比較醜,但足可以說明問題了:) ):
你可以在左邊設置圖形的各項參數,點擊Apply Changes按鈕,右邊的圖形將被更新。同理,其他類型的圖形都可以實時更新。
點擊右邊的保存,保存此圖,命名爲search_all_logs_visual。接下來切換到Dashboard頁面:
單擊新建按鈕,選擇剛剛保存的search_all_logs_visual圖形,面板上將展示該圖:
如果有較多數據,我們可以根據業務需求和關注點在Dashboard頁面添加多個圖表:柱形圖,折線圖,地圖,餅圖等等。當然,我們可以設置更新頻率,讓圖表自動更新:
如果設置的時間間隔夠短,就很趨近於實時分析了。
到這裏,ELK平臺部署和基本的測試已完成。
參考: