业务知识——Logger日志打印规范
初期,我們的系統比較簡單,在這個過程中,加上大家平時都不注意,所以Logger日志一直是打印的隨心所欲,什么是隨心所欲的,就是大家想在哪里打日志就在哪里打印日志,想輸出什么就輸出什么,毫無規范可言,在系統的流量和業務量變得越來越復雜的情況下,良好的日志才能幫助我們更快地找到問題,更好地解決問題。
?
首先來看一下比較常用的Logger日志級別(部分未列出):
鑒于我們是一個金融系統,流量還是不算很大,我個人認為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.分支流程如果必要再外層打印參數,可以知道具體走了哪個流程。
?
以上都是日常工作的痛點,希望自己可以在今后工作中也以此為標準。
總結
以上是生活随笔為你收集整理的业务知识——Logger日志打印规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础知识——异常Throwabl
- 下一篇: IDE使用经验——阿里代码规范 Ec