1. 程式人生 > >Java專案中使用log記錄日誌的一些總結

Java專案中使用log記錄日誌的一些總結

本文介紹了一下自己在Java專案中使用log的一些總結,從日誌的作用、日誌的選用、日誌級別介紹、日誌記錄的一些最佳實踐幾個方面闡述。

日誌的作用

主要作用包括:

1、出問題後定位當時問題

2、顯示程式當前執行狀態

日誌的選用

Java裡存在眾多的開源日誌框架: slf4j, logback, log4j, JCL(Apache Common Logging), JUL(JDK自帶的java.util.logging)等。這其中slf4j屬於一套簡潔的日誌API,其並不包含日誌的實現(它並不負責日誌輸出等,JCL也包含API)。

slf4j提供了眾多的介面卡可以適配其他所有開源日誌框架,這樣讓我們在程式碼中只需面對slf4j的API,然後可以任意切換日誌的實現。你可能會講我們並不需要切換日誌框架這種功能,但是我們專案中需要使用大量的第三方庫,而這些第三方庫使用的日誌框架各不相同,不同的日誌框架需要不同的配置,不同的配置會導致日誌輸出到不同的位置。

一個應用肯定需要將日誌level,日誌輸出等收納起來統一管理。對於這種情況,我們可以使用slf4j的介面卡將第三方庫中各種日誌的實現接管,接管之後就可以統一配置這些第三方庫中使用的日誌了。

在這些日誌實現框架中又數logback效能最優,所以在選擇日誌實現的時候推薦使用logback。

日誌級別介紹

level 定義簡直就是一門藝術,  好的定義應該遵循以下原則:

debug:完整詳細的記錄流程的關鍵路徑. 應該用於開發人員比較感興趣的跟蹤和除錯資訊, 生產環境中正常都不會開啟debug狀態

info:應該簡潔明確讓管理員確認狀態。記錄相當重要的,對於終端使用者和系統管理員有意義的訊息。關鍵系統引數的回顯、後臺服務的初始化狀態、需要系統管理員知會確認的關鍵資訊都需要使用INFO級別

warn:能清楚的告知所有人發生了什麼情況.能引起人的重視,指示潛在問題,但不一定需要處理。

error:系統出現了異常或不期望出現的問題,希望及時得到關注的處理。需要注意的一個點,不是所有的異常都需要記錄成error。

日誌記錄的一些最佳實踐

以下可以根據專案實際情況當做規範使用:

1、tomcat配置access日誌,記錄每次http請求相關資訊

2、dubbo配置access日誌,記錄dubbo consumer和provider的每次請求呼叫和處理

3、在系統裡呼叫外部的地方,記錄請求的介面、引數、返回結果、花費時間、遇到的異常等

4、在系統裡出現異常的地方,記錄異常的堆疊,如果可以,儘量通過異常的日誌能還原當時的情景,比如當時受影響的是哪個使用者、傳入的變數是什麼、處理哪些核心資料引發的異常等等

5、有些程式碼在編寫時就知道很難被執行到或者不希望被執行到、以及一些基本不會走到的else塊,這些地方需要記錄下核心日誌

6、禁止使用 System.out 或 System.error

7、禁止使用 Apache Commons Logging , Java Util Logging,推薦使用slf4j,推薦使用Logback,程式碼中使用Slf4j記錄日誌

8、業務日誌使用獨立的日誌配置,不能採用className。舉個例子,我之前在qunar做專案時,涉及打通許多第三方管理系統,和每一個第三方的互動的日誌都會單獨儲存到一個日誌檔案中

9、INFO及以上的系統日誌統一輸出到Console。在生產環境中如果將系統log切分成多個檔案, 是非常不利於問題排查的. 不僅要同時追找多個檔案, 還要匹配問題發生的時間點. 最要命的是, 有些異常是被print到 console裡的。

10、日誌配置Rolling,可以根據實際情況配置按天、按小時進行輪轉,生成新的日誌檔案

11、記錄程式狀態需要包含發生時間(一般框架裡就會帶上)、大資料量更新的進度、關鍵變數及正在做哪些重要事情。

12、不同的日誌檔案儘量使用同樣的格式輸出(logback配置同樣的pattern), 這樣方便指令碼通用及第三方解析

結尾

如何在專案裡記錄好日誌是一門學問,也是一門藝術。這裡把自己目前想到的總結一下,歡迎指正,也歡迎有更多的最佳實踐能分享出來。


作者: _Jimin_ 
連結:https://www.imooc.com/article/21178
來源:慕課網
本文原創釋出於慕課網 ,轉載請註明出處,謝謝合作!