打造分布式日志收集系統


前言

系統一大,就會拆分成多個獨立的進程,比如web+wcf/web api等,也就成了分布式系統。

要看一個請求怎么從頭到尾走的,就有些困難了,要是進行DEBUG、跟蹤,就更加麻煩了,困難程度要視進程多少而定,越多越復雜。

分布式日志收集系統就登場了。

今天介紹一款

全開源日志收集、展示系統 - logstash(基於java)+kibana(基於JRuby, logstash已自帶)+ElasticSearch+RabbitMQ

架構圖如下

這張圖是拷貝來的

    • 里面雖然是Redis,但是沒關系,換成RabbitMQ照樣行
    • 這個Broker Redis/RabbitMQ去掉實際上也行,只是去掉會會造成高峰時刻拖垮ElasticSearch,此處出現的目的是消峰
    • Shipper Logstash圖中有3個,意思是可以有多個,可以分布在不同Server上,無論是windows還是linux系統都可以
    • 看完上面三點,實際上已經對這個架構的擴展性很放心了,平心而論,確實很flex,具體可看http://logstash.net/docs/1.4.2/

 安裝方法

略,baidu一下一堆一堆的,注意的地方就一個:Kibana已經在logstash最新版中自帶了,不用再去單獨下載kibana代碼,直接運行logstash web即可

 

正文

 本文采用的logstash input類型為file的輸入,既通過檢測文本文件的方式進行日志采集(logstash支持很多input,文本文件只是其中一種,具體請看上面的文檔url)

我們假設目前日志文件log.txt中存在一行日志記錄,比如:

[192.168.1.1][2014-10-22 23:59:00][ERROR][Page1.Page_Load]Null Exception, bal...bal...

此時logstash shipper會根據它的配置文件找到這個log.txt, 然后檢測到有一個新行出現了,內容是上面這些,然后它會:

    • 正則匹配
      • 192.168.1.1==>ServerIP
      • 2014-10-22 23:59:00==>EventTime
      • ERROR==>LogLevel
      • Page1.Page_Load==>Method
      • Null Exception, bal...bal...==>MessageBody
      • 哈哈,當然上述匹配法則是需要在配置文件中配置的
    • 發送到后續節點
      • 本篇中,是發送到RabbitMQ節點
      • 哈哈,當然也是需要配置文件中配置好的

RabbitMQ實際上是起到了緩沖消峰的作用

那么RabbitMQ的消息是要給到誰呢?它是logstash indexer,logstash indexer實際上很簡單,只是接收MQ中的消息,然后發送到再后端的ES倒排序引擎

然后就到了最后一個Kibana Web查詢控制台,開發人員最終是通過這個Kibana查詢界面來查詢logstash收集來的日志的,下面來說說Kibana

Kibana的數據來源:

ElasticSearch:支持分布式擴展的倒排序搜索引擎,內核基於Lucene

Kibana的查詢界面自定義:

可以靈活變換顯示的列

可以鼠標圈時間范圍(根據時間段來查看日志列表)

可以自動刷新日志列表

可以自定義所監控日志的版本(如:生產系統、UAT系統、開發DEMO)

可以查看某段時間段內某字段的餅圖等統計圖

可以靈活排序

可以定義列的顯示前后位置

可以定義列是否顯示

上一張圖看看樣子吧

 

整個收集系統的搭建,除了logstash這一套組件的搭建外,還需要關注的地方是日志文件保存的格式,就是上面包含有中括號的那種一行一行的記錄是以什么格式保存,因為這個格式會對應logstash參數的解析,而logstash參數的名稱會映射到kibana的查詢界面中。

 

在程序這邊,需要關注的是用統一的日志記錄函數來記錄,這樣文本文件內容的格式就保證了,整個閉環就形成了。

 

具體的配置方式,大家可以加入一些logstash的qq群,或者看本文開頭提供的文檔鏈接。

 

DONE.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM