日志的分析和監控在系統開發中占非常重要的地位,系統越複雜,日志的分析和監控就越重要,常見的需求有:
根據關鍵字查詢日志詳情
監控系統的運作狀況
統計分析,比如接口的調用次數、執行時間、成功率等
異常資料自動觸發消息通知
基于日志的資料挖掘
很多團隊在日志方面可能遇到的一些問題有:
開發人員不能登入線上伺服器檢視詳細日志,經過運維周轉費時費力
日志資料分散在多個系統,難以查找
日志資料量大,查詢速度慢
一個調用會涉及多個系統,難以在這些系統的日志中快速定位資料
資料不夠實時
常見的一些重量級的開源Trace系統有
<a href="https://github.com/facebook/scribe" target="_blank">facebook scribe</a>
<a href="https://github.com/cloudera/flume" target="_blank">cloudera flume</a>
<a href="http://twitter.github.io/zipkin" target="_blank">twitter zipkin</a>
<a href="http://storm-project.net/" target="_blank">storm</a>
這些項目功能強大,但對于很多團隊來說過于複雜,配置和部署比較麻煩,在系統規模大到一定程度前推薦輕量級下載下傳即用的方案,比如logstash+elasticsearch+kibana(LEK)組合。
對于日志來說,最常見的需求就是收集、查詢、顯示,正對應logstash、elasticsearch、kibana的功能。
<a href="http://logstash.net/" target="_blank">logstash首頁</a>
logstash部署簡單,下載下傳一個jar就可以用了,對日志的處理邏輯也很簡單,就是一個pipeline的過程
對應的插件有
從上面可以看到logstash支援常見的日志類型,與其他監控系統的整合也很友善,可以将資料輸出到zabbix、nagios、email等。
推薦用redis作為輸入緩沖隊列。
你還可以把資料統計後輸出到graphite,實作統計資料的可視化顯示。
<a href="http://graphite.wikidot.com/" target="_blank">graphite</a>
參考文檔
<a href="http://cookbook.logstash.net/" target="_blank">cookbook</a>
<a href="http://logstash.net/docs/1.2.1" target="_blank">doc</a>
<a href="http://demo.logstash.net/" target="_blank">demo</a>
<a href="http://www.elasticsearch.org/" target="_blank">elasticsearch首頁</a>
elasticsearch是基于lucene的開源搜尋引擎,近年來發展比較快,主要的特點有
real time
distributed
high availability
document oriented
schema free
restful api
elasticsearch的詳細介紹以後再寫,常用的一些資源如下
smartcn, ES預設的中文分詞
<a href="https://github.com/elasticsearch/elasticsearch-analysis-smartcn" target="_blank">https://github.com/elasticsearch/elasticsearch-analysis-smartcn</a>
mmseg
<a href="https://github.com/medcl/elasticsearch-analysis-mmseg" target="_blank">https://github.com/medcl/elasticsearch-analysis-mmseg</a>
ik
<a href="https://github.com/medcl/elasticsearch-analysis-ik" target="_blank">https://github.com/medcl/elasticsearch-analysis-ik</a>
pinyin, 拼音分詞,可用于輸入拼音提示中文
<a href="https://github.com/medcl/elasticsearch-analysis-pinyin" target="_blank">https://github.com/medcl/elasticsearch-analysis-pinyin</a>
stconvert, 中文簡繁體互換
<a href="https://github.com/medcl/elasticsearch-analysis-stconvert" target="_blank">https://github.com/medcl/elasticsearch-analysis-stconvert</a>
elasticsearch-servicewrapper,用Java Service Wrapper對elasticsearch做的一個封裝
<a href="https://github.com/elasticsearch/elasticsearch-servicewrapper" target="_blank">https://github.com/elasticsearch/elasticsearch-servicewrapper</a>
Elastic HQ,elasticsearch的監控工具
<a href="http://www.elastichq.org/" target="_blank">http://www.elastichq.org</a>
elasticsearch-rtf,針對中文內建了相關插件(rtf = Ready To Fly)
<a href="http://log.medcl.net/" target="_blank">作者首頁</a>
<a href="http://kibana.org/" target="_blank">kibana首頁</a>
kibana是一個功能強大的elasticsearch資料顯示用戶端,logstash已經内置了kibana,你也可以單獨部署kibana,最新版的kibana3是純html+js用戶端,可以很友善的部署到Apache、Nginx等Http伺服器。
從demo可以先看一下kibana的一些基本功能
圖表
資料表格,可以自定義哪些列顯示以及顯示順序
可以看到實際執行的查詢語句
新加一行
新加panel,可以看到支援的panel類型
加一個餅圖
用地圖顯示統計結果
按照http response code來統計
豐富的查詢文法
下面列一下一個簡易LEK體驗環境的搭建步驟
<a href="http://www.oracle.com/technetwork/java" target="_blank">oracle java首頁</a>
省略安裝過程,推薦1.7+版本
設定java的環境變量,比如
<a href="http://redis.io/" target="_blank">redis首頁</a>
可以通過redis源代碼裡utils/install_server下的腳本簡化配置工作
install_server.sh在問你幾個問題後會把redis安裝為開機啟動的服務,可以通過下面的指令行來啟動/停止服務
啟動redis用戶端來驗證安裝
<a href="http://www.elasticsearch.org/" target="_blank">Elasticsearch首頁</a>
elasticsearch解壓即可使用非常友善,接下來我們看一下效果,首先啟動ES服務,切換到elasticsearch目錄,運作bin下的elasticsearch
通路預設的9200端口
logstash的最新版已經内置kibana,你也可以單獨部署kibana。kibana3是純粹JavaScript+html的用戶端,是以可以部署到任意http伺服器上。
可以修改config.js來配置elasticsearch的位址和索引。
把上面的系統內建起來
首先把redis和elasticsearch都啟動起來
為logstash建立一個配置檔案
配置檔案内容如下
用這個配置檔案啟動logstash agent
啟動logstash内置的web
檢視web,應該還沒有資料
在redis 加一條資料
看看elasticsearch中的索引現狀
再通過logstash web查詢一下看看
通過單獨的kibana界面檢視
logstash預設按天建立ES索引,這樣的好處是删除曆史資料時直接删掉整個索引就可以了,友善快速。
elasticsearch也可以設定每個文檔的ttl(time to live),相當于設定文檔的過期時間,但相比删除整個索引要耗費更多的IO操作。
elasticsearch預設會按照分隔符對字段拆分,日志有些字段不要分詞,比如url,可以為這類字段設定not_analyzed屬性。
elasticsearch預設一個索引操作會在所有分片都完成對文檔的索引後才傳回,你可以把複制設定為異步來加快批量日志的導入。
優化JVM
優化系統可以打開最大檔案描述符的數量
适當增加索引重新整理的間隔
首先你的程式要寫日志
記錄的日志要能幫助你分析問題,隻記錄"參數錯誤"這樣的日志對解決問題毫無幫助
不要依賴異常,異常隻處理你沒考慮到的地方
要記錄一些關鍵的參數,比如發生時間、執行時間、日志來源、輸入參數、輸出參數、錯誤碼、異常堆棧資訊等
要記錄sessionid、transitionid、userid等幫你快速定位以及能把各個系統的日志串聯起來的關鍵參數
推薦純文字+json格式
使用隊列
<a href="http://www.rsyslog.com/" target="_blank">rsyslog</a>
<a href="http://www.balabit.com/network-security/syslog-ng" target="_blank">syslog-ng</a>
<a href="http://graylog2.org/" target="_blank">graylog</a>
<a href="http://fluentd.org/" target="_blank">fluentd</a>
<a href="http://nxlog-ce.sourceforge.net/" target="_blank">nxlog</a>
本文轉自 wdy198622 51CTO部落格,原文連結:http://blog.51cto.com/weimouren/1716001