首頁  >  文章  >  Java  >  如何正確使用Java日誌

如何正確使用Java日誌

little bottle
little bottle轉載
2019-04-28 16:55:362498瀏覽

關於日誌,在大家的印像中都是比較簡單的,只須引入了相關依賴包,剩下的事情就是在專案中「盡情」的打印我們需要的資訊了。但是往往越簡單的東西越容易讓我們忽視,從而導致一些不該有的bug發生,作為一個嚴謹的程式設計師,怎麼能讓這種事情發生呢?所以下面我們就來了解關於日誌的那些正確使用姿勢。

正文

日誌規格

命名

首先是日誌檔案的命名,盡量要做到見名知意,團隊裡面也必須使用統一的命名規範,不然「髒亂差」的日誌檔案會影響大家排查問題的效率。這裡推薦以「projectName_logName_logType.log」來命名,這樣透過名字就可以清晰的知道該日誌檔案是屬於哪個項目,什麼類型,有什麼作用。例如在我們MessageServer專案中監控Rabbitmq 消費者相關的日誌檔案名稱可以定義成「messageserver_rabbitmqconsumer_monitor.log」。

保存時間

關於日誌保存的時間,普通的日誌檔案建議保留15天,若比較重要的可依實際情況延長,具體請參考各自伺服器磁碟空間以及日誌檔案大小作出最優選擇。

日誌等級

常見的日誌等級有以下:

DEBUG等級:記錄偵錯程式相關的資訊。 INFO等級:記錄程式正常運作有意義的資訊。 WARN等級:記錄可能會出現潛在錯誤的訊息。 ERROR等級:記錄目前程式出錯的訊息,需要被關注處理。 Fatal等級:表示出現了嚴重錯誤,程式將會中斷執行。

建議在專案中使用這四個級別, ERROR、WARN、INFO 、DEBUG。

正確姿勢

1、提前判斷日誌等級

//条件判断if(logger.isDebugEnabled){
    logger.debug("server info , id : " + id + ", user : " + user);
}//使用占位符logger.debug("server info , id : {}, user : {}",id,user);

對於DEBUG,INFO等級的日誌,在我們的程式中是比較高頻的存在,當我們的專案大了,日誌變多了,這時候為了程式運行的效率,我們必須以條件判斷或者佔位符的方式來列印日誌。為什麼呢?假如我們專案中配置的日誌等級為WARN,那麼對於我們下面的日誌輸出語句' logger.debug("server info , id : " id ", user : " user);',雖然該日誌不會被列印,但是卻會執行字串拼接的操作,這裡我們的user是實例對象,所以還會執行toString方法,這樣就白白浪費了不少系統的資源。

2、避免多餘日誌輸出

在我們的生產環境中,一般禁止DEBUG日誌的輸出,其列印的頻率是非常高的,容易對正常運作的程式造成嚴重的影響,在我們最近的專案中就有遇到類似的情況。

那麼這時候該學會使用additivity屬性

<logger name="xx" additivity="true">

在這邊配置成true的話,也就是預設的情況,這時候當前Logger會繼承父Logger的Appender,說白了就是當前日誌的輸出除了輸出在目前日誌檔案以外,還會輸出至父檔裡。所以一般情況下,我們為了避免重複列印,會將這個參數設定成false,以減少不必要的輸出。

3、保證日誌記錄資訊完整

在我們的程式碼中,日誌記錄的內容要包含異常的堆疊,請勿隨意輸出「XX出錯」等簡單的日誌,這對於錯誤的調試毫無幫助。所以我們在記錄異常的時候一定要帶上堆疊訊息,例如

logger.error("rabbitmq consumer error,cause : "+e.getMessage(),e);

切記在輸出物件實例的時候,必須確保物件重寫了toString方法,否則只會輸出其hashCode值。

4、定義logger變數為static

private static final Logger logger = LoggerFactory.getLogger(XX.class);

確保一個物件只使用一個Logger對象,避免每次都重新創建,否則可能會導致OOM。

5、正確使用日誌等級

try{    //..}catch(xx){
    logger.info(..);
}

這樣一來,本來是ERROR的訊息,全都印在INFO日誌檔裡了,不知情的同事還會在死盯著錯誤日誌,而且還找不出問題,多影響工作效率是吧?

6、推薦使用slf4j logback組合

logback庫裡自身就已經實現了slf4j的接口,就無需引入多餘的適配器了,而且logback也具有更多的優點,建議新項目可以使用這個組合。還有一點要注意,當引入slf4j後,要注意其實際使用的日誌庫是否是由我們引入的,也有可能會使用了我們第三方依賴包所帶入的日誌庫,這樣就可能會導致我們的日誌失效。

7、日誌的聚合分析

日誌的聚合可以把位於不同伺服器之間的日誌統一起來分析處理,如今ELK技術堆疊亦或者的EFG(fluentd elasticsearch grafana)等都是一些比較成熟的開源解決方案。

拿ELK來說,可以在我們的伺服器上直接透過logstash來讀取應用程式列印的日誌文件,或者也可以在我們專案中的日誌設定檔裡配置好相關的socket信息,列印的時候直接把日誌訊息輸出至logstash。再交由elasticsearch存儲,kibana展示。

相關教學:Java影片教學

以上是如何正確使用Java日誌的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:oschina.net。如有侵權,請聯絡admin@php.cn刪除