天天看點

JAVA程式設計規範之日志規約

日志對于一個系統來說非常重要,查找異常資訊、分析系統運作情況等都需要用到日志。

調試

在Java項目調試時,檢視棧資訊可以友善地知道目前程式的運作狀态,輸出的日志便于記錄程式在之前的運作結果。如果你大量使用​

​System.out​

​​或者​

​System.err​

​,我承認這是一種最友善最有效的方法,我在剛接觸這門語言的時候也時常這麼做,隻是這種方式顯得不夠專業。

定位錯誤

不要以為項目能正确跑起來就可以高枕無憂,項目在運作一段時候後,可能由于資料問題,網絡問題,記憶體問題等出現異常。這是日志可以幫助開發或者運維人員快速定位錯誤位置,定制解決方案。

資料分析

大資料的興起,使得大量的日志分析成為可能,ELK也讓日志分析門檻降低了很多。日志中蘊含了大量的使用者資料,包括點選行為,興趣偏好等,使用者畫像對于公司下一步的戰略方向有一定指引作用。

日志規約

1、【強制】應用中不可直接使用日志系統(Log4j、Logback)中的 API,而應依賴使用日志架構 SLF4J 中的 API,使用門面模式的日志架構,有利于維護和各個類的日志處理方式統一。

2、【強制】日志檔案推薦至少儲存 15 天,因為有些異常具備以“周”為頻次發生的特點。

3、【強制】應用中的擴充日志(如打點、臨時監控、通路日志等)命名方式: appName_logType_logName.log。logType:日志類型,推薦分類有 stats/desc/monitor/visit 等;logName:日志描述。這種命名的好處: 通過檔案名就可知道日志檔案屬于什麼應用,什麼類型,什麼目的,也有利于歸類查找。

正例 : mppserver 應用中單獨監控時區轉換異常,如: mppserver_monitor_timeZoneConvert.log

說明 : 推薦對日志進行分類,如将錯誤日志和業務日志分開存放,便于開發人員檢視,也便于

通過日志對系統進行及時監控。

4、【強制】對 trace/debug/info 級别的日志輸出,必須使用條件輸出形式或者使用占位符的方式。

說明 : logger.debug("Processing trade with id: " + id + " symbol: " + symbol);如果日志級别是 warn,上述日志不會列印,但是會執行字元串拼接操作,如果 symbol 是對象,會執行 toString() 方法,浪費了系統資源,執行了上述操作,最終日志卻沒有列印。

5、【強制】避免重複列印日志,浪費磁盤空間,務必在 log4j.xml 中設定 additivity=false。

6、【強制】異常資訊應該包括兩類資訊: 案發現場資訊和異常堆棧資訊。如果不處理,那麼通過關鍵字 throws 往上抛出。

正例 : logger.error(各類參數或者對象 toString + "_" + e.getMessage(), e);

7、【推薦】謹慎地記錄日志。生産環境禁止輸出 debug 日志;有選擇地輸出 info 日志;如果使用 warn 來記錄剛上線時的業務行為資訊,一定要注意日志輸出量的問題,避免把伺服器磁盤

撐爆,并記得及時删除這些觀察日志。

說明 : 大量地輸出無效日志,不利于系統性能提升,也不利于快速定位錯誤點。記錄日志時請思考: 這些日志真的有人看嗎? 看到這條日志你能做什麼? 能不能給問題排查帶來好處?