前言
系統一大,就會拆分成多個獨立的進程,比如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.