天天看點

使用logstash+elasticsearch+kibana快速搭建日志平台 logstash elasticsearch kibana 安裝部署 資料清理 索引 elasticsearch 優化 最佳實踐 其他日志輔助工具

日志的分析和監控在系統開發中占非常重要的地位,系統越複雜,日志的分析和監控就越重要,常見的需求有:

根據關鍵字查詢日志詳情

監控系統的運作狀況

統計分析,比如接口的調用次數、執行時間、成功率等

異常資料自動觸發消息通知

基于日志的資料挖掘

很多團隊在日志方面可能遇到的一些問題有:

開發人員不能登入線上伺服器檢視詳細日志,經過運維周轉費時費力

日志資料分散在多個系統,難以查找

日志資料量大,查詢速度慢

一個調用會涉及多個系統,難以在這些系統的日志中快速定位資料

資料不夠實時

常見的一些重量級的開源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