Java中打印日志,這4點很重要!


打印日志,要注意下面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等高並發分布式、大數據、機器學習等技術。
關注下方公眾號即可免費領取:

Java碎碎念公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM