Logger日誌列印規範
首先來看一下比較常用的Logger日誌級別(部分未列出):
- error - 執行期錯誤日誌記錄,應該有專門的error日誌檔案。;
- warn - 警告資訊,如程式呼叫了一個即將作廢的介面,介面的不當使用,執行狀態不是期望的但仍可繼續處理等;
- info - 有必要的事件資訊記錄。
- debug - 除錯資訊,業務處理進行狀態,當前的變數值等;
- 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如果往外丟擲,則不應該列印異常資訊。
- try {
- throw new Exception();
- } catch (Exception e) {
- logger.error("xxxxxx", e);
- throw e;
- }
這樣的處理解釋不合適的,因為丟擲去的異常,一般情況下你肯定會記錄。(當然如果你不記錄,那麼我就搞不懂為什麼你要丟擲去了)。
4.如何列印error Log
log.error("xxxxxxxxxxxx", e);
這種比較推薦,當然在實際過程中我也看到有同事用了其他的方式,形如:
logger.error("xxxxxx", e.getStackTrace());
可以是可以,這種打印出來的stackTrace比較醜。。。用一下你就知道。
Log4j、Log4j2的原始碼中對於異常Exception的處理時這樣的。
所以【佔位符小於實際的引數數量時會把最後一個設定為Throwable】,即可以正常列印error。
- log.error("xxxxxxxxxxxx{}","第一個引數" e); //可以正常列印
- log.error("xxxxxxxxxxxx{},{}","第一個引數" e); //不能正常列印,因為佔位符和引數數量一樣
- private void initThrowable(final Object[] params, final int argCount, final int usedParams) {
- if (usedParams < argCount && params[argCount - 1] instanceof Throwable) {
- this.throwable = (Throwable) params[argCount - 1];
- } else {
- this.throwable = null;
- }
- }
5.日誌記錄建議用英文(這點沒有依據)。
用中文除了佔用大點好像沒什麼不好,但是還是建議用字母。
6.http請求時應該列印 url ,param, get/post,statusCode,ret,timeUsed等關鍵欄位。
反正我吃過沒列印這些的虧,還不是我寫的程式碼。說出來都是淚。
7.相對6,別人呼叫介面的時候應列印 入參,請求用時,返回值,來源等關鍵欄位。
8.分支流程如果必要再外層列印引數,可以知道具體走了哪個流程。
轉載筆記