1. 程式人生 > >Logger日誌列印規範

Logger日誌列印規範

首先來看一下比較常用的Logger日誌級別(部分未列出):

  1. error - 執行期錯誤日誌記錄,應該有專門的error日誌檔案。;
  2. warn - 警告資訊,如程式呼叫了一個即將作廢的介面,介面的不當使用,執行狀態不是期望的但仍可繼續處理等;
  3. info - 有必要的事件資訊記錄。
  4. debug - 除錯資訊,業務處理進行狀態,當前的變數值等;
  5. trace - 一些更詳細的跟蹤資訊;

鑑於我們是一個金融系統,流量還是不算很大,我個人認為debug級別和info級別可以統一歸為info級別下列印,這是考慮到現在系統穩定性不夠,處於一個快速迭代開發的過程中,線上問題可能隨時都有,所以將業務流轉與部分變數值打印出來還是很有必要的。error記錄錯誤日誌,但如果錯誤是預期會發生的,並且已經有了其他的處理流程,則建議使用warn級別。例如在try-catch中catch塊裡處理後繼續流程的日誌記錄。

1.Logger物件的定義:

<strong>private static final Logger logger = LoggerFactory.getLogger(Test.class);</strong>

2.日誌中不出現計算或方法呼叫,防止在列印日誌的時候報錯。

之前在上家公司的時候就確實出現過因列印日誌而系統RunTimeException的,不應該出現。

3.try-catch如果往外丟擲,則不應該列印異常資訊。

  1. try {
  2.     throw new Exception();
  3. } catch (Exception e) {
  4.     logger.error("xxxxxx", e);
  5.     throw e;
  6. }

這樣的處理解釋不合適的,因為丟擲去的異常,一般情況下你肯定會記錄。(當然如果你不記錄,那麼我就搞不懂為什麼你要丟擲去了)。

4.如何列印error Log

log.error("xxxxxxxxxxxx", e); 

這種比較推薦,當然在實際過程中我也看到有同事用了其他的方式,形如:

logger.error("xxxxxx", e.getStackTrace());

可以是可以,這種打印出來的stackTrace比較醜。。。用一下你就知道。

Log4j、Log4j2的原始碼中對於異常Exception的處理時這樣的。

所以【佔位符小於實際的引數數量時會把最後一個設定為Throwable】,即可以正常列印error。

  1. log.error("xxxxxxxxxxxx{}","第一個引數" e); //可以正常列印
  2. log.error("xxxxxxxxxxxx{},{}","第一個引數" e); //不能正常列印,因為佔位符和引數數量一樣
  1. private void initThrowable(final Object[] params, final int argCount, final int usedParams) {
  2.         if (usedParams < argCount && params[argCount - 1] instanceof Throwable) {
  3.             this.throwable = (Throwable) params[argCount - 1];
  4.         } else {
  5.             this.throwable = null;
  6.         }
  7.     }

5.日誌記錄建議用英文(這點沒有依據)。

用中文除了佔用大點好像沒什麼不好,但是還是建議用字母。

6.http請求時應該列印 url ,param, get/post,statusCode,ret,timeUsed等關鍵欄位。

反正我吃過沒列印這些的虧,還不是我寫的程式碼。說出來都是淚。

7.相對6,別人呼叫介面的時候應列印 入參,請求用時,返回值,來源等關鍵欄位。

8.分支流程如果必要再外層列印引數,可以知道具體走了哪個流程。

轉載筆記