close
文章出處

  前段時間,公司的一個項目,需要做很多的數據接口和同步程序,于是就遇到了日志記錄的問題,何時記錄,如何記錄,哪些要記哪些不用記等問題。針對日志記錄的問題,經過一系列討論,終于達成了統一的處理辦法。解決了各個模塊系統,不同的開發人員,日志記錄不統一,隨意的問題。今天終于抽出時間把這個問題總結并結合網絡上的資料,進行整理。

  為什么要記錄日志

  記錄日志是調試程序,監視程序運行的一種重要的方式,主要有兩個目的:bug的及時發現和定位,顯示程序運行狀態。正確詳細的日志記錄能夠快速的定位問題。同樣,通過查看日志,可以看出程序正在做什么,是不是按預期的設計在執行,所以記錄下程序的運行狀態是必要的。

  哪些地方需要記日志

  1. 調用或封裝外部程序或接口
    程序中對外部系統與模塊的依賴調用前后都應該記下日志,方便接口調試。出問題時也可以很快查出是哪里出的問題

    LOG.debug("Calling external system:" + parameters);
    Object result = null;
    try {
      result = callRemoteSystem(params);
      LOG.debug("Called successfully. result is " + result);
    } catch (Exception e) {
      LOG.warn("Failed at calling xxx system . exception : " + e);
    }

  2.對重要對象或變量被修改,要以INFO記錄修改前的信息和修改后的狀態。
    程序中重要的狀態信息的變化應該記錄下來,方便查問題時還原現場,推斷程序運行過程

    boolean isRunning;
    isRunning = true;
    LOG.info("System is running");
    //...
    isRunning = false;
    LOG.info("System was interrupted by " + Thread.currentThread().getName());

  3.系統入口與出口:
    系統的入口和出口,重要方法或模塊的執行。記錄它的輸入與輸出,方便定位。

  4.業務異常或者重要的業務處理:
    任何業務異常都應該記下來,還有系統中一些重要的業務,比如結算等業務,也最好能記錄下來。

  5.非預期執行:
    為程序在“有可能”執行到的地方打印日志。如果我想刪除一個文件,結果返回成功。但事實上,那個文件在你想刪除之前就不存在了。最終結果是一致的,但程序得讓我們知道這種情況,要查清為什么文件在刪除之前就已經不存在

    int myValue = xxxx;
    int absResult = Math.abs(myValue);
    if (absResult < 0) {
      LOG.info("Original int " + myValue + "has nagetive abs " + absResult);
    }
  6.很少出現的else情況:
    代碼中,一定要有完整的if else,如果else 里面沒有要執行的,記錄日志,這樣避免else吞掉你的請求,或是返回給你難以理解的結果。

    Object result = null;
    if (running) {
      result = xxx;
    } else {
      result = yyy;
      LOG.debug("System does not running, we change the final result");
    }

  7. 批量數據的執行進度:

    LOG.debug("current progress: " + (currentPos * 100 / totalAmount) + "%");

  日志記錄的方式

  1. 日志信息應該包含記錄程序運行時間和錯誤發生的時間.

  2. 日志信息清晰準確有意義
    日志應該是清晰準確的: 當看到日志的時,就能準確的知道錯誤是因為連接池取不到連接導致的問題。

    Connection connection = ConnectionFactory.getConnection();
    if (connection == null) {
      LOG.warn("System initialized unsuccessfully");
    }
  3. 記錄錯誤的位置
    代碼中,一定要記錄下錯誤所在的文件名和函數名(必須能區分開重載函數),有行數最好。

  4. 區分日志級別
    在程序中Log進行分級是很重要的,通常可以分為6 級:TRACE<DEBUG<INFO<WARN<ERROR<FATAL。
DEBUG用來輸出調試信息,一般是在程序中不是非常重要的地方;INFO代表一些比較重要的信息,比如程序初始化完畢,ERROR一般指程序本身引起的,可以恢復的錯誤;FATAL一般指程序所依賴的環境出現錯誤,使的程序不恢復。其中常用的是DEBUG和 ERROR。

  5. 信息詳細準確
一定要記錄下完整準確的信息,否則還不如記錄,因為錯誤的信息可能會誤導開發人員。所以最簡單的辦法就是記錄完整的stack trace.

  6. 最好能給log帶上上下文
    沒有相應的上下文的log,不過是噪音,它們不會對調試過程中有意義的數值或是空間起作用。
    Transaction failed 這樣的log信息比沒有記錄更讓人抓狂。




不含病毒。www.avast.com
arrow
arrow
    全站熱搜

    AutoPoster 發表在 痞客邦 留言(0) 人氣()