日誌信息是我們開發人員進行運行觀察、故障診斷、系統調優的重要工具,一個規範性的日誌記錄規則,對於線上問題排查定位,形成有效監控規則,
降低排查時間具有重大意義,同時日誌信息也是大數據的一部分,也需要遵循數據的規範(含安全)。
基本原則
-
日誌輸出不可影響系統正常運行;
-
日誌不可輸出保密信息;
-
日誌內容可供開發人員定位問題;
-
日誌內容可提供監控、調優信息;
-
日誌內容可提供運行上下文場景還原、調用鏈追蹤信息。
-
日誌內容儘量詳細:“charge 20 Yuan from account 34567 but 10 Yuan available” 而不是“charge failed”
-
只打印技術異常,不打印用戶異常。用戶異常,如:用戶名或密碼錯誤
-
要throw的異常 不要打日誌,最後一層打
-
打出完整信息,包括stacktrace
-
嚴格注意日誌級別
-
不能使用System.out/err
時機
-
JDK或第三方工具拋出異常:這種情況通常是程序設計不合理造成的,會影響業務運行,是質量非常高的報錯。應當適當記錄日誌,根據實際結合業務的情況使用warn或者error級別;
-
業務流程或數據不符合預期:常見的場景還包括外部參數不正確,數據處理問題導致狀態不在合理範圍內等等。開發人員需判斷能否容忍某種情形發生,而打印warn或error級別的日誌;
-
系統核心關鍵動作:比如CA提供商的切換等關鍵操作要做info級別的記錄;
-
系統啓動參數:系統運行往往依賴一些關鍵配置,這些參數可以以info級別記錄入日誌。
模板
logger.error(“[Class name.Method name] [Some Error Msg] happens. [Probably Because]. [Probably need to do] [params] .”, param1, param2);
Plain Text
推薦使用上邊模板打印日誌信息。總之日誌內容要讓別人看到日之後知道大概發生了什麼?應該怎麼處理?
默認日誌分類
service.log
dal.log -- dal層和mybatis日誌默認打印的文件;
task.log -- task層的日誌默認打印的文件;
default.log -- 除去上邊的日誌,其它日誌默認打印的地方;
error.log -- 異常日誌打印的日誌文件;
上述日誌默認日誌等級爲INFO,字符集是UTF-8。
注意:
1. 有必要才記錄日誌,避免頻繁過量無用日誌的產生;
2. 日誌等級必須嚴格區分,影響業務正常運行的情況纔可打印error級別日誌;
3. 禁止多個字符串拼接來組裝日誌信息,推薦使用參數方式;
4. 日誌要有格式,具有良好的可讀性;
5. 不可直接使用日誌系統(Log4j、Logback)中的API,而應依賴使用日誌框架SLF4J中的API,使用門面模式的日誌框架,有利於維護;
6. 各個類的日誌處理方式統一