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), 這樣方便腳本通用及第三方解析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM