天天看點

使用開源軟體sentry來收集日志

[size=medium] 對于一個已經上線的系統,存在未知的bug或者運作時發生異常是很常見的事情,随之而來的幾點需求産生了:

1、系統發生異常時是否能夠通過日志檢視到具體原因

2、怎樣第一時間撲捉到異常

3、系統都出現了哪些異常

4、哪些異常出現頻率高[/size]

[size=medium]第一點好解決,利用log4j、logback等日志架構把異常資訊(stacktrace,params)列印到日志檔案,可以在查找時很友善看到相信資訊。但是這樣往往具有滞後性,等到使用者回報或者系統崩潰的時候才去線上檢視日志找到原因,可能異常已經發了好幾天了,損失很大。是以第二點顯得格外重要,怎樣做到第一時間捕捉到異常呢?你大可以tail -f yourlog.log盯着螢幕一直看,出現異常馬上解決,但是日志數量大、分布在多個伺服器的時候這樣的做法肯定行不通了,是以需要有監控措施,第一時間告警。對于第三和第四點則是需要對異常進行分類統計。

是以一個日志收集系統的原型勾勒出來了:具備收集日志(對于分布式環境下,日志分布在各台伺服器上)、日志統計(統計次數最多的異常,往往這就是系統的隐患所在)、監控告警(出現異常或者異常積累到一定數量以短信或者郵件的形式告警)、以及以上功能的可視化界面。其實自己去開發這樣一個系統還是有難度的,好在目前已經有好的開源産品能夠直接使用了,這就是Sentry,一個基于Djongo的日志收集系統。Sentry的界面漂亮、支援的語言和架構多、易于擴充、效率不錯。

Sentry的安裝和配置網上有很多教程,難度不大。Sentry是c/s結構的軟體,是以部署好了伺服器端以後還需要用戶端,Sentry的用戶端支援python/php/ruby/java等語言并且支援在衆多架構中內建。[/size]

[size=large]以和Java的logback內建為例:

在項目的pom.xml檔案中配置Sentry用戶端的依賴:[/size]

<!-- sentry raven-java configuration -->

<dependency>
<groupId>net.kencochrane.raven</groupId>
<artifactId>raven-logback</artifactId>
<version>4.1.1</version>
</dependency>
           

<!-- jaskson configuration -->

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
           

<!-- sentry appender configuration -->

<appender name="Sentry" class="net.kencochrane.raven.logback.SentryAppender">
<dsn>
http://your api [email protected] sentry host/4
</dsn>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
           

[size=medium]dsn中需要配置api keys,這個在sentry的項目配置中可以得到,一切就是這麼簡單,無縫內建,不影響現有的日志列印,還能幫助收集異常、統計異常,多好的事情,呵呵,下面附上一張我們部署的sentry系統的截圖,敏感資訊用線條抹去了請諒解。[/size]

[img]http://dl2.iteye.com/upload/attachment/0091/5276/4201ab66-cc37-32bc-a308-8ae1529d5194.png[/img]

[size=medium]最後需要說一下,畢竟sentry的日志收集是通過網絡傳輸(TCP/UDP),會帶來性能上的損耗。是以不适用于将所有業務日志全部收集到Sentry,是以有了Sentry以後還是需要普通log的,畢竟業務邏輯的跟蹤和分析等等也離不開log,Sentry隻是輔助的一個工具。[/size]