打印日志,要注意下面4點。
一、預先判斷日志級別
對DEBUG、INFO級別的日志,必須使用條件輸出或者使用占位符的方式打印。該約定綜合考慮了程序的運行效率和日志打印需求。
先來看一個反例:
log.debug("輸入參數信息id=" + id + ",obj=" + obj);
如果在某個配置了打印級別為WARN的應用中,按照上面代碼打印DEBUG級別的日志,那么該日志不會被打印,但是會執行字符串拼接操作;如果obj是一個對象,還會執行toString()方法,白白浪費系統資源。
代碼正確示例如下:
//使用條件判斷形式
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屬性簡介:
它是子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等高並發分布式、大數據、機器學習等技術。
關注下方公眾號即可免費領取: