系統日誌對於開發者原來如此重要

與一個簡單的算法不同,一個合格的系統不僅僅要求具有運行的高效和計算的準確,同時又必須兼顧穩定性、可靠性。其次,對於開發人員來說,又必須具有可拓展性和

可維護性。各方面都必須很完善,這樣的一個系統才能稱得上是一個合格完美的系統。

系統日誌對於開發者原來如此重要

簡單的站在開發人員的角度分析,比較重視的是系統的可維護性,畢竟開發人員直面的是系統的代碼實現。一個代碼結構冗雜、模塊設計混亂、命名“異想天開”的系統對於開發者來說簡直到了咬牙切齒的地步!不能忍!堅決不能忍!所以在平時的開發過程中就要時刻注意著系統的實現機制,從宏觀設計和微觀實現上面同時進行精雕細琢。

說到可維護性及不得不涉及到系統監控和Bug的快速定位。在開發階段還比較容易對系統進行監控,一般都會在本機上對系統的運行進行實時監控。而對於bug的定位,開發者都會熟練使用debug功能進行bug定位,更有甚者通過多年的開發經驗根據系統的異常信息直接能分析出來Bug產生的原因、位置以及解決方案。但是,系統畢竟是人開發的,我們無法預料到在運行中會出行什麼想不到的問題,即使在各種測試中沒有出現,但是也無法保證不會出現一些意想不到的問題。那麼在系統運行期間如果產生問題出現異常且無法在測試環境中重現,我們又該如何快速、準確地對bug進行定位分析和解決呢?

系統日誌對於開發者原來如此重要

舉個親身的例子吧,公司一套設備監控系統,用來對上萬個節點進行實時監控,如果該節點有異常(比如溫度過高、電壓過高等)則向系統進行發出告警信息。在開發環境中只有五十多個設備被安全(不會產生什麼告警)的放在機房中供開發和測試使用,這種測試環境根本無法模擬實際環境。系統在測試中沒有出現過什麼大的問題。然而,在實際的運行環境中,偶爾發現系統的一個模塊功能會喪失,失去告警接收的功能。在本地測試的時候從來沒有發現過類似問題,但是部署在實際環境中就會有發生。我們不可能實時的24小時對系統進行人工監控,那麼該如何定位功能喪失的原因呢?這時,對於系統日誌來說就“是時候表演真正的技術了”。後來通過系統日誌分析之後發現功能的喪失是由於大量的告警同時上報導致數據庫鏈接不夠用產生大量connectionTimeout進而導致OOM異常,這個模塊徹底死了。可見,日誌對於運行環境中系統的監控和問題定位是至關重要的,在系統設計、開發和實現的過程中必須時刻注意著log的輸出,這將會對於日後的系統監控和異常分析起至關重要的作用!

那麼,在系統日誌實現上應該注意哪些問題呢?

如何做到不濫用日誌、減少大量無用信息,讓日誌記錄足夠精簡明瞭?

第一:系統的哪些運行信息需要進行日誌記錄?

1、功能模塊的啟動和結束(完整的系統由多個功能模塊組成,每個模塊負責不同的功能,因此需要對模塊的啟動和結束進行監控。是否在需要的時機正常加載該模塊?又是否在退出結束的時候正常完成結束操作,正常退出?

2、用戶的登錄和退出(哪位用戶在什麼時間通過什麼IP登錄或退出了系統)

3、系統的關鍵性操作(數據庫鏈接信息、網絡通信的成功與失敗等)

4、系統運行期間的異常信息(NPE、OOM以及其他的超時、轉換異常等)

5、關鍵性方法的進入和退出(一些重要業務處理的方法,在進入和結束的時候需要有日誌信息進行輸出)

……

……

第二:什麼樣的日誌格式有助於開發者進行明確的分析?

日誌信息要求必須精簡,過多的無用信息不但對系統分析起不到什麼作用,反而會增加系統的運行壓力、消耗系統的運行資源。這裡有個日誌模板,可供參考。

時間-[線程名][日誌等級]-日誌輸出位置(全類名,可以精確到方法名):日誌信息

2019-09-04 10:49:20.296-[Thread-initRedis21504][INFO]-com.shanghai.LoginController.initLogInfo:LingMing[User] is logining

日誌信息的內容可以根據不同的情況進行設計,但是前面的時間到日誌輸出位置必須要保證完整性,這樣才有利於日誌的分析。

系統日誌對於開發者原來如此重要

第三:如何對不同的日誌信息進行等級劃分?

日誌等級通常分為四種:DEBUG、INFO、WARN、ERROR

DEBUG:系統調試信息,通常用於開發過程中對系統運行情況的監控,在實際運行環境中不進行輸出。

INFO:系統運行的關鍵性信息,通常用於對系統運行情況的監控。

WARN:告警信息,系統存在潛在的問題,有可能引起運行異常,但此時並未產生異常。

ERROR:系統錯誤信息,需要進行及時處理和優化。

這裡列出來了各種等級的日誌信息,在開發過程中哪些信息需要設置為哪種等級有賴於開發者的自己判斷,這裡只是給個建議。

日誌的管理是系統很重要的一部分,千萬不可忽略其重要性。完整的日誌將會在系統維護中起著異常重要的作用,就好像磨刀不誤砍柴工一樣,日誌就像對系統進行分析的工具,工具便捷了,對系統分析起來就能達到事半功倍的效果。開發者必須要明白日誌的價值和意義,萬萬不可忽略和輕視,並且在系統設計之初就建議制定一份關於日誌管理的說明規範,明確哪些方法、操作必須進行日誌輸出,在進行開發過程中也要嚴格遵守。

至於日誌輸出的實現,不同的開發語言有不同的日誌管理框架,同一種語言也有很多不同的日誌管理方案,這裡就不再進行贅述。本文目的就是想讓開發者看到日誌的重要性。

"


分享到:


相關文章: