log列印及異常處理相關

qixiaobo發表於2018-01-05

title: log列印及異常處理相關 tags:

  • exception
  • log
  • 異常
  • java categories: 工作日誌 date: 2016-08-25 18:18:55

  1. 不得使用System.out, System.err,e.printStackTrace進行日誌記錄,請改使用logger.debug、logger.error
  1. 系統中目前採用log4j作為列印輸出使用

    private Logger logger = Logger.getLogger(getClass());

    private Logger logger = Logger.getLogger(XXX.class);

    獲取對應logger例項

  2. debug/info級別的資訊,資訊本身需要計算或合併的,必須加 isXxxEnabled() 判斷在前,這樣可以大大提高高併發下的效率。如:

    if (logger.isDebugEnabled()) {

        logger.debug(cal());

    }

  3. 系統中建議使用自定義異常,譬如丟擲業務異常,不要每次使用new Exception 而是應該使用BizException等自定義異常

  4. 異常發生時,捕獲異常並且不加任何處理時可能極大的增加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);

             }

  5. 錯誤記錄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);

    或者其他更詳細的資訊譬如 錯誤描述 [關鍵資訊]包括執行的引數使用者資訊等等

  6. 記錄日誌時確保呼叫日誌處理不會出錯,譬如

    log.debug("Processing request with id: {}", request.getId());

    此處可能報NPE

  7. 記錄日誌時確保不會列印太多日誌導致拖垮應用,特別是常見切面或者通用處理邏輯處加日誌要注意

  8. 日誌輸出級別(由高到低)

    • **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級別

相關文章