打印日誌,要注意下面4點。app
對DEBUG、INFO級別的日誌,必須使用條件輸出或者使用佔位符的方式打印。該約定綜合考慮了程序的運行效率和日誌打印需求。機器學習
先來看一個反例:分佈式
log.debug("輸入參數信息id=" + id + ",obj=" + obj);
若是在某個配置了打印級別爲WARN的應用中,按照上面代碼打印DEBUG級別的日誌,那麼該日誌不會被打印,可是會執行字符串拼接操做;若是obj是一個對象,還會執行toString()方法,白白浪費系統資源。高併發
代碼正確示例以下:oop
//使用條件判斷形式 if (log.isDebugEnabled()) { log.debug("輸入參數信息id={}", id); } //使用佔位符形式 log.debug("輸入參數信息id={},obj={}", id, obj);
生產環境禁止輸出DEBUG日誌且有選擇的輸出INFO日誌。
使用INFO、WARN級別來記錄業務日誌行爲信息時,必定要控制輸出量,以避免磁盤空間不足,同時要爲日誌文件設置合理的生命週期,及時清理過時的日誌。學習
避免重複打印,務必在日誌配置文件中設置additivity=false,示例以下:大數據
<logger name="com.test" additivity="false"> <level value="INFO" /> <appender-ref ref="logfile" /> </logger>
additivity屬性簡介:debug
它是子Logger是否繼承父Logger的輸出源(appender)的標誌位,默認狀況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender裏輸出。把additivity設爲false,則子Logger只會在本身的appender裏輸出,而不會在父Logger的appender裏輸出。日誌
WARN、ERROR都是與錯誤有關的日誌級別,但不要一發生錯誤就打印ERROR日誌,好比一些業務異常是能夠經過引導重試就能恢復的,例如用戶輸入參數錯誤,在這種狀況下,記錄日誌是爲了在用戶諮詢時能夠還原現場若是輸出爲ERROR級別就表示一旦出現就須要人爲介入,這顯然不合理。因此,ERROR級別只記錄系統邏輯錯誤、異常或者違反重要的業務規則,其餘錯誤均可以歸爲WARN級別。
日誌記錄的內容須要包括現場上下文信息和異常堆棧信息,因此打印時候須要注意下面兩點:
1.記錄異常時必定要輸出異常堆棧,例如:
log.error("xxx" + e.getMessage(), e);
2.日誌中若是輸出對象實例,要確保實例類重寫了toString方法,不然只會打印對象的hashCode值,沒有實際意義。
參考資料:《碼出高效Java開發手冊》
推薦閱讀
1.SpringBoot系列-日誌配置基礎篇
2.SpringBoot集成JWT實現權限認證
3.一分鐘帶你瞭解JWT認證!
4.SpringBoot中如何優雅的讀取yml配置文件?
5.SpringBoot中如何靈活的實現接口數據的加解密功能?
限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分佈式、大數據、機器學習等技術。
關注下方公衆號便可免費領取: