java後端開發常用日誌技巧
阿新 • • 發佈:2019-01-07
經過不斷的專案實踐,不斷總結,一個好的開發人員,應該有個好的開發習慣,日誌是開發過程中不可缺少的一項,有了日誌可以節省很多我們不必要的麻煩,也可以使我們迅速的定位問題。
使用Logging框架寫Log基本上就三個步驟- 引入loggerg類和logger工廠類
- 宣告logger
- 記錄日誌
//1. 引入slf4j介面的Logger和LoggerFactoryimport org.slf4j.Logger;
import org.slf4j.LoggerFactory;
publicclass UserService {
//2. 宣告一個Logger,這個是static的方式,我比較習慣這麼寫。
publicboolean verifyLoginInfo(String userName, String password) {
//3. log it,輸出的log資訊將會是:"Start to verify User [Justfly]
logger.info("Start to verify User [{}]", userName);
returnfalse;
}
}
學習連結:
兩種方式的優劣概述如下:- 靜態Logger物件相對來說更符合語義,節省CPU,節省記憶體,不支援注入
- 物件變數Logger支援注入,對於一個JVM中執行的多個引用了同一個類庫的應用程式,可以在不同的應用程式中對同個類的Logger進行不同的配置。比如Tomcat上部署了倆個應用,他們都引用了同一個lib
- public boolean isTraceEnabled();
- public boolean isDebugEnabled();
- public boolean isInfoEnabled();
- public boolean isWarnEnabled();
- public boolean isErrorEnabled();
1if(logger.isDebugEnabled()){
2 logger.debug("["+resultCount+"]/["+totalCount+"] of users are returned");
3 }
3. Log什麼
前面講了怎麼使用Loggger的方法log日誌,下面繼續講講在什麼地方需要記錄什麼級別的log,以及需要記錄什麼內容。3.1 如何使用不同級別的Log
SLF4J把Log分成了Error,Warn,Info,Debug和Trace五個級別。我們可以把這倆個級別分成兩組3.1.1 使用者級別
Error、Warn和Info這三個級別的Log會出現在生產環境上,他們必須是運維人員能閱讀明白的3.1.1.1 Error
- 影響到程式正常執行、當前請求正常執行的異常情況,例如:
- 開啟配置檔案失敗
- 第三方應用網路連線異常
- SQLException
- 不應該出現的情況,例如:
- 某個Service方法返回的List裡面應該有元素的時候缺獲得一個空List
- 做字元轉換的時候居然報錯說沒有GBK字符集
3.1.1.2 Warn
- 不應該出現但是不影響程式、當前請求正常執行的異常情況,例如:
- 有容錯機制的時候出現的錯誤情況
- 找不到配置檔案,但是系統能自動建立配置檔案
- 即將接近臨界值的時候,例如:
- 快取池佔用達到警告線
3.1.1.3 Info
- 系統執行資訊
- Service方法的出入口
- 主要邏輯中的分步驟
- 外部介面部分
- 客戶端請求引數和返回給客戶端的結果
- 呼叫第三方時的呼叫引數和呼叫結果
try{
}catch(Exception ex){
String errorMessage=String.format("Error while reading information of user [%s]",userName);
logger.error(errorMessage,ex);
thrownew UserServiceException(errorMessage,ex);
}
最後為了避免日誌過於繁瑣,開發者應該注意在專案中日誌的列印,簡單一句話,記錄有利於定位問題的日誌,做到不多打,也不少打同時根據需求調節日誌的級別,一般建議到info級別。