對於一個已經上線的系統,存在未知的bug或者運行時發生異常是很常見的事情,隨之而來的幾點需求產生了:
一、系統發生異常時是否可以經過日誌查看到具體緣由
二、怎樣第一時間撲捉到異常
三、系統都出現了哪些異常
四、哪些異常出現頻率高
第一點好解決,利用log4j、logback等日誌框架把異常信息(stacktrace,params)打印到日誌文件,能夠在查找時很方便看到相信信息。可是這樣每每具備滯後性,等到用戶反饋或者系統崩潰的時候纔去線上查看日誌找到緣由,可能異常已經發了好幾天了,損失很大。因此第二點顯得格外重要,怎樣作到第一時間捕捉到異常呢?你大能夠tail -f yourlog.log盯着屏幕一直看,出現異常立刻解決,可是日誌數量大、分佈在多個服務器的時候這樣的作法確定行不通了,因此須要有監控措施,第一時間告警。對於第三和第四點則是須要對異常進行分類統計。
因此一個日誌收集系統的原型勾勒出來了:具有收集日誌(對於分佈式環境下,日誌分佈在各臺服務器上)、日誌統計(統計次數最多的異常,每每這就是系統的隱患所在)、監控告警(出現異常或者異常積累到必定數量以短信或者郵件的形式告警)、以及以上功能的可視化界面。其實本身去開發這樣一個系統仍是有難度的,好在目前已經有好的開源產品可以直接使用了,這就是Sentry,一個基於Djongo的日誌收集系統。Sentry的界面漂亮、支持的語言和框架多、易於擴展、效率不錯。
Sentry的安裝和配置網上有不少教程,難度不大。Sentry是c/s結構的軟件,因此部署好了服務器端之後還須要客戶端,Sentry的客戶端支持python/php/ruby/java等語言而且支持在衆多框架中集成。
以和Java的logback集成爲例:
在項目的pom.xml文件中配置Sentry客戶端的依賴:
<!-- 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:
- </dsn>
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>ERROR</level>
- </filter>
- </appender>
dsn中須要配置api keys,這個在sentry的項目配置中能夠獲得,一切就是這麼簡單,無縫集成,不影響現有的日誌打印,還能幫助收集異常、統計異常,多好的事情,呵呵,下面附上一張咱們部署的sentry系統的截圖,敏感信息用線條抹去了請諒解。