ELK(ElasticSearch, Logstash, Kibana)搭建實時日誌分析平臺

摘要: 前段時間研究的Log4j+Kafka中,有人建議把Kafka收集到的日誌存放於ES(ElasticSearch,一款基於Apache Lucene的開源分佈式搜索引擎)中便於查找和分析,在研究此方案可行性的時候,我發現ELK(ElasticSearch, Logstash, Kibana)平臺剛好能夠同時實現日誌收集、日誌搜索和日誌分析的功能,因而又去學習了一番。以後發現若是使用這三者,收集日誌也能夠再也不使用Kafka了,Logstash就能夠幫咱們完成。固然,雖然Logstash也支持使用Kafka做爲數據源輸入,可是使用這三者就沒有必要再增長系統複雜度了。

ELK平臺介紹

在搜索ELK資料的時候,發現這篇文章比較好,因而摘抄一小段:html

如下內容來自:http://baidu.blog.51cto.com/71938/1676798java

日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員能夠經過日誌瞭解服務器軟硬件信息、檢查配置過程當中的錯誤及錯誤發生的緣由。常常分析日誌能夠了解服務器的負荷,性能安全性,從而及時採起措施糾正錯誤。node

一般,日誌被分散的儲存不一樣的設備上。若是你管理數十上百臺服務器,你還在使用依次登陸每臺機器的傳統方法查閱日誌。這樣是否是感受很繁瑣和效率低下。當務之急咱們使用集中化的日誌管理,例如:開源的syslog,將全部服務器上的日誌收集彙總。linux

集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,通常咱們使用grep、awk和wc等Linux命令能實現檢索和統計,可是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法不免有點力不從心。apache

開源實時日誌分析ELK平臺可以完美的解決咱們上述的問題,ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成。官方網站:https://www.elastic.co/productscentos

  • Elasticsearch是個開源分佈式搜索引擎,它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。瀏覽器

  • Logstash是一個徹底開源的工具,他能夠對你的日誌進行收集、過濾,並將其存儲供之後使用(如,搜索)。安全

  • Kibana 也是一個開源和免費的工具,它Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助您彙總、分析和搜索重要數據日誌。ruby

----------------------------摘抄內容結束-------------------------------服務器

畫了一個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平臺部署和基本的測試已完成。

 

參考:

http://baidu.blog.51cto.com/71938/1676798

http://blog.csdn.net/cnweike/article/details/33736429

評論 (28)

請問你的applog是在哪裏進行配置的?
 
nivance
同問
 
擺渡者

引用來自「nivance」的評論

同問
什麼applog?
 
expectszc

引用來自「nivance」的評論

同問
applog就是配置文件中output 下的index
 
擺渡者

引用來自「daqin32」的評論

請問你的applog是在哪裏進行配置的?
仔細看了下文章,發現以前的log4j_to_es.conf文件中的output下的elasticsearch中的index => "ec",實際應該寫爲index => "applog",誤導了你們,已修改,謝謝指正。
 
擺渡者

引用來自「nivance」的評論

同問
仔細看了下文章,發現以前的log4j_to_es.conf文件中的output下的elasticsearch中的index => "ec",實際應該寫爲index => "applog",誤導了你們,已修改,謝謝指正。
 
jack1007
若是日誌刷新比較快,好比一天10G的日誌,上百臺機器,這套系統分析的過來嗎?特別是能分析實時的java報錯日誌嗎?
 
擺渡者

引用來自「jack1007」的評論

若是日誌刷新比較快,好比一天10G的日誌,上百臺機器,這套系統分析的過來嗎?特別是能分析實時的java報錯日誌嗎?
額,很遺憾的告訴你,我只是在本地環境使用了幾臺服務器搭建了這個框架,我也沒研究過如何使這套系統的性能達到最優,也沒研究過這套系統的上限是多大。抱歉
 
zhuganlai
mark一下,不錯的文章!
 
logen2014
mark
 
vbs_liuyoung
樓主,你好,我想問下,你有試過用java代碼去查過es中的日誌嗎
 
擺渡者

引用來自「vbs_liuyoung」的評論

樓主,你好,我想問下,你有試過用java代碼去查過es中的日誌嗎
那段時間只是在研究一套收集和分析日誌的系統,沒有試過使用Java代碼去訪問ES中的日誌哦。請問這樣作有什麼優勢呢?
 
hong
樓主,type參數要在哪裏配置呢?是否是要配置log4j_to_es.conf裏面?是input仍是output?
按照你教程一步步作下來,ES的head頁面docs顯示0.不知道是否是疏漏某些配置!
 
hong
是我本身的問題,沒有看清楚log4j的配置:
# for package com.demo.elk, log would be sent to socket appender.
log4j.logger.com.demo.elk=DEBUG, socket
Application放到com.demo.elk包下就能夠向logstash 發生日誌數據了 41
 
擺渡者

引用來自「hong」的評論

是我本身的問題,沒有看清楚log4j的配置:
# for package com.demo.elk, log would be sent to socket appender.
log4j.logger.com.demo.elk=DEBUG, socket
Application放到com.demo.elk包下就能夠向logstash 發生日誌數據了 41
嗯嗯,成功了就好。我還在想我在寫博客的時候有沒有忽略什麼呢,也沒有時間再去重現你的問題了,因此一直沒有回覆你。
 
clamshine
mark 13
 
克溫s
mark
 
痕跡EX

引用來自「jack1007」的評論

若是日誌刷新比較快,好比一天10G的日誌,上百臺機器,這套系統分析的過來嗎?特別是能分析實時的java報錯日誌嗎?

引用來自「擺渡者」的評論

額,很遺憾的告訴你,我只是在本地環境使用了幾臺服務器搭建了這個框架,我也沒研究過如何使這套系統的性能達到最優,也沒研究過這套系統的上限是多大。抱歉
公司目前的日誌系統沒有用到ELK方案,整個日誌系統架構與ELK類似,但核心也是elasticsearch。實時日誌記錄都是1秒內查詢成功,最近10天,日均日誌量在12G左右,一點問題沒有
 
痕跡EX

引用來自「jack1007」的評論

若是日誌刷新比較快,好比一天10G的日誌,上百臺機器,這套系統分析的過來嗎?特別是能分析實時的java報錯日誌嗎?

引用來自「擺渡者」的評論

額,很遺憾的告訴你,我只是在本地環境使用了幾臺服務器搭建了這個框架,我也沒研究過如何使這套系統的性能達到最優,也沒研究過這套系統的上限是多大。抱歉
用java去查ES着實有點蛋疼,作個日誌聚合分析curl簡潔但換成java感受就麻煩多了。若是要作強烈建議仍是看官網,遍尋不少博客最後仍是在官網get到想要的
 
擺渡者

引用來自「jack1007」的評論

若是日誌刷新比較快,好比一天10G的日誌,上百臺機器,這套系統分析的過來嗎?特別是能分析實時的java報錯日誌嗎?

引用來自「擺渡者」的評論

額,很遺憾的告訴你,我只是在本地環境使用了幾臺服務器搭建了這個框架,我也沒研究過如何使這套系統的性能達到最優,也沒研究過這套系統的上限是多大。抱歉

引用來自「痕跡EX」的評論

公司目前的日誌系統沒有用到ELK方案,整個日誌系統架構與ELK類似,但核心也是elasticsearch。實時日誌記錄都是1秒內查詢成功,最近10天,日均日誌量在12G左右,一點問題沒有
你好,請問你公司的日誌環境是多少臺機器?每臺天天都是12G的量嗎?歡迎分享

引用來自「jack1007」的評論

若是日誌刷新比較快,好比一天10G的日誌,上百臺機器,這套系統分析的過來嗎?特別是能分析實時的java報錯日誌嗎?

引用來自「擺渡者」的評論

額,很遺憾的告訴你,我只是在本地環境使用了幾臺服務器搭建了這個框架,我也沒研究過如何使這套系統的性能達到最優,也沒研究過這套系統的上限是多大。抱歉
不知道有沒有誤會你的意思,不過若是是基於Flume+kafka+Storm的架構能夠達到你的要求
 
bill-xu
樓主大人,我搭建好了以後,打開http://192.168.18.230:5601/,一直顯示Configure an index pattern,寫上applog也是沒有create圖標出現,顯示:Unable to fetch manpping.Do you have indices matching the passem? 是哪裏的問題呢?求幫助
 
jared

引用來自「bill-xu」的評論

樓主大人,我搭建好了以後,打開http://192.168.18.230:5601/,一直顯示Configure an index pattern,寫上applog也是沒有create圖標出現,顯示:Unable to fetch manpping.Do you have indices matching the passem? 是哪裏的問題呢?求幫助
先弄點數據進去再來點能夠了
 
wishma
kibana查詢不出來任何doc
 
Kevin_Zhan
no such file to load -- bundler/dep_proxy
 
鄭龍飛
很強,很穩
 
學道ing
博主,你好,我按照你的步驟一步一步來,啓動logstash時報沒法找到jruby錯誤
 
oswl
可使用slf4j嗎?

文章摘自:https://my.oschina.net/itblog/blog/547250

https://www.jianshu.com/p/797073c1913f

https://www.cnblogs.com/huangxincheng/p/7918722.html

http://www.178linux.com/71014

https://www.cnblogs.com/yuhuLin/p/7018858.html

相關文章
相關標籤/搜索