title: log列印及異常處理相關 tags:
- exception
- log
- 異常
- java categories: 工作日誌 date: 2016-08-25 18:18:55
- 不得使用System.out, System.err,e.printStackTrace進行日誌記錄,請改使用logger.debug、logger.error
-
系統中目前採用log4j作為列印輸出使用
private
Logger logger = Logger.getLogger(getClass());
private
Logger logger = Logger.getLogger(XXX.
class
);
獲取對應logger例項
-
debug/info級別的資訊,資訊本身需要計算或合併的,必須加 isXxxEnabled() 判斷在前,這樣可以大大提高高併發下的效率。如:
if
(logger.isDebugEnabled()) {
logger.debug(cal());
}
-
系統中建議使用自定義異常,譬如丟擲業務異常,不要每次使用new Exception 而是應該使用BizException等自定義異常
-
異常發生時,捕獲異常並且不加任何處理時可能極大的增加debug成本。希望確實存在如上情況請顯式將改異常名稱設定為ignore,否則idea會有警報
try
{
Method createByMethod;
createByMethod = po.getClass().getMethod(
"set"
+MODIFIER, String.
class
);
createByMethod.invoke(po, pkUser);
createByMethod = po.getClass().getMethod(
"set"
+IDOWNORG, String.
class
);
createByMethod.invoke(po, idOwnOrg);
}
catch
(NoSuchMethodException | InvocationTargetException | IllegalArgumentException | IllegalAccessException | SecurityException ignore) {
// logger.warn(e.getMessage(),e);
}
-
錯誤記錄log日誌格式為
//A
log.error(e);
//B
log.error(e, e);
//C
log.error(
""
+ e);
//D
log.error(e.toString());
//E
log.error(e.getMessage());
//F
log.error(
null
, e);
正確記錄日誌方式為
log.error(
"e.getMessage()"
, e);
log.error(
"Error reading configuration file"
, e);
或者其他更詳細的資訊譬如 錯誤描述 [關鍵資訊]包括執行的引數使用者資訊等等
-
記錄日誌時確保呼叫日誌處理不會出錯,譬如
log.debug(
"Processing request with id: {}"
, request.getId());
此處可能報NPE
-
記錄日誌時確保不會列印太多日誌導致拖垮應用,特別是常見切面或者通用處理邏輯處加日誌要注意
-
日誌輸出級別(由高到低)
- **ERROR:**系統中發生了非常嚴重的問題,必須馬上有人進行處理。沒有系統可以忍受這個級別的問題的存在。比如:NPEs(空指標異常),資料庫不可用,關鍵業務流程中斷等等
- **WARN:**發生這個級別問題時,處理過程可以繼續,但必須對這個問題給予額外關注。這個問題又可以細分成兩種情況:一種是存在嚴重的問題但有應急措施(比如資料庫不可用,使用Cache);第二種是潛在問題及建議(ATTENTION),比如生產環境的應用執行在Development模式下、管理控制檯沒有密碼保護等。系統可以允許這種錯誤的存在,但必須及時做跟蹤檢查
- **INFO:**重要的業務處理已經結束。在實際環境中,系統管理員或者高階使用者要能理解INFO輸出的資訊並能很快的瞭解應用正在做什麼。比如,一個和處理機票預訂的系統,對每一張票要有且只有一條INFO資訊描述 "[Who] booked ticket from [Where] to [Where]"。另外一種對INFO資訊的定義是:記錄顯著改變應用狀態的每一個action,比如:資料庫更新、外部系統請求
- **DEBUG:**用於開發人員使用。將在TRACE章節中一起說明這個級別該輸出什麼資訊
- **TRACE:**非常具體的資訊,只能用於開發除錯使用。部署到生產環境後,這個級別的資訊只能保持很短的時間。這些資訊只能臨時存在,並將最終被關閉。要區分DEBUG和TRACE會比較困難,對一個在開發及測試完成後將被刪除的LOG輸出,可能會比較適合定義為TRACE級別