Java專案日誌記錄方案
一、概述
1、採用slf4j作為日誌API,採用logback作為日誌輸出工具,用slf4j橋接方式替換掉log4j和commons-logging。
2、採用trace(追蹤)、debug(除錯)、info(資訊)、warn(警告)、error(錯誤)、fatal(致命)共6種日誌級別。
3、採用dev(開發環境)、test(測試環境)、production(生產環境)等不同的日誌配置,根據環境變數自動識別。
4、特殊的記錄,需要大批量寫入日誌檔案,應該採用非同步執行緒寫檔案。
二、日誌級別定義
採用trace(追蹤)、debug(除錯)、info(資訊)、warn(警告)、error(錯誤)、fatal(致命)共6種日誌級別。
日誌級別使用原則:
1、fatal(致命錯誤)使用原則
fatal為系統級別的異常,發生fatal錯誤,代表伺服器整個或者核心功能已經無法工作了!!
1)在伺服器啟動時就應該檢查,如果存在致命錯誤,直接拋異常,讓伺服器不要啟動起來(啟動了也無法正常工作,不如不啟動)。
2)如果在伺服器啟動之後,發生了致命的錯誤,則記錄fatal級別的錯誤日誌,最好是同時觸發相關的修復和告警工作(比如,給開發和維護人員傳送告警郵件)。
2、error(錯誤)使用原則
error為功能或者邏輯級別的嚴重異常,發生error級別的異常,代表功能或者重要邏輯遇到問題、無法正常工作
3、warn(警告)使用原則
warn用在某些邏輯非常規,發生了一些小故障但是沒有大的影響,或者重要資料被修改,或者某些操作需要引起重視。
4、info(資訊)使用原則
info用於記錄一些有用的、關鍵的資訊,一般這些資訊出現得不頻繁,只是在初始化的地方或者重要操作的地方才記錄。
5、debug(除錯)使用原則
debug用於記錄一些除錯資訊,為了方便檢視程式的執行過程和相關資料、瞭解程式的動態。
6、trace(跟蹤)使用原則
trace用於記錄一些更詳細的除錯資訊,這些資訊無需每次除錯時都打印出來,只在需要更詳細的除錯資訊時才開啟。
7、專案穩定執行時的日誌量
1)正常情況下,trace日誌至少是debug日誌的100倍,
trace級別的日誌量 : debug級別的日誌量 > 100 : 1,
也就是說trace日誌非常多,debug日誌相對較少。
2)debug級別的日誌量 : info級別的日誌量 > 1000: 1,
也就是說正常情況下,info日誌很少,只在部分重要位置會輸出 info日誌。
3)error日誌和warn日誌,正常情況下,幾乎為0,當出現異常時,error日誌和warn日誌量 也在可控範圍,不會超過debug級別的最大日誌量。
三、日誌輸出(Appender)分類
分為5個一般類:
FILE_EXCEPTION (異常日誌,包括ERROR和WARN)
FILE_APP (應用日誌,包括當前應用package下面的日誌和DEBUG級別以上的其他日誌)
FILE_INFO (普通訊息日誌)
FILE_DEBUG (除錯日誌)
FILE_TRACE(追蹤日誌)
SYSOUT(控制檯輸出,可以包括以上所有日誌)
擴充套件類: 包括非同步輸出的日誌,或者特殊業務日誌。
舉例說明:
假如
當前應用的 Main Package 為 cn.zollty.lightning
ROOT_LEVEL為 trace,應用日誌 LEVEL 為 debug
有以下日誌列印:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Logger loggerA = LoggerFactory.getLogger(cn.zollty.lightning.Tests. class );
loggerA.trace( "--------" );
loggerA.debug( "--------" );
loggerA.info( "--------" );
loggerA.warn( "--------" );
loggerA.error( "--------" );
Logger loggerB = LoggerFactory.getLogger(org.apache.kafka.Consumer. class );
loggerB.trace( "--------" );
loggerB.debug( "--------" );
loggerB.info( "--------" );
loggerB.warn( "--------" );
loggerB.error( "--------" );
|
那麼,異常日誌(FILE_EXCEPTION)輸出的為:
loggerA.warn("--------");
loggerA.error("--------");
loggerB.warn("--------");
loggerB.error("--------");
控制檯(SYSOUT)輸出日誌的為;
loggerA.debug("--------");
loggerA.info("--------");
loggerA.warn("--------");
loggerA.error("--------");
loggerB.trace("--------");
loggerB.debug("--------");
loggerB.info("--------");
loggerB.warn("--------");
loggerB.error("--------");
應用日誌(FILE_APP)輸出的為:
loggerA.debug("--------");
loggerA.info("--------");
loggerA.warn("--------");
loggerA.error("--------");
loggerB.info("--------");
loggerB.warn("--------");
loggerB.error("--------");
2、歷史日誌檔案
異常日誌(error和warn)最多儲存 9000 M(生產,測試)
app日誌最多儲存 9000 M (生產,測試)
trace日誌最多儲存 1000 M (僅供測試用,一般不用)
debug、info日誌最多儲存 5000 M(一般不用,用app日誌就夠了)
四、各環境預設日誌定義
開發環境
1)預設日誌級別定義為:
app包為TRACE級別。日誌的ROOT Level為DEBUG級別。
2)
啟用 System.out 控制檯輸出日誌;
啟用error.log為錯誤和警告日誌、app.log為應用日誌(包括app包下的日誌和其他INFO級別以上的日誌)。
測試環境