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

打印日誌,要注意下面4點。app

1、預先判斷日誌級別

對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);

2、避免無效日誌打印

生產環境禁止輸出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裏輸出。日誌

3、區別對待錯誤日誌

WARN、ERROR都是與錯誤有關的日誌級別,但不要一發生錯誤就打印ERROR日誌,好比一些業務異常是能夠經過引導重試就能恢復的,例如用戶輸入參數錯誤,在這種狀況下,記錄日誌是爲了在用戶諮詢時能夠還原現場若是輸出爲ERROR級別就表示一旦出現就須要人爲介入,這顯然不合理。因此,ERROR級別只記錄系統邏輯錯誤、異常或者違反重要的業務規則,其餘錯誤均可以歸爲WARN級別。

4、保證記錄完整內容

日誌記錄的內容須要包括現場上下文信息和異常堆棧信息,因此打印時候須要注意下面兩點:

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碎碎念公衆號

相關文章
相關標籤/搜索