Java日誌正確使用姿勢

2021-09-19 16:44:15 字數 1963 閱讀 1395

前言

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

正文日誌規範

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

儲存時間

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

日誌級別

常見的日誌級別有以下:

debug級別:記錄除錯程式相關的資訊。

info級別:記錄程式正常執行有意義的資訊。

warn級別:記錄可能會出現潛在錯誤的資訊。

error級別:記錄當前程式出錯的資訊,需要被關注處理。

fatal級別:表示出現了嚴重錯誤,程式將會中斷執行。建議在專案中使用這四種級別, error、warn、info 、debug。

正確姿勢

1、提前判斷日誌級別

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

2、避免多餘日誌輸出

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

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

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

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

切記在輸出物件例項的時候,須確保物件重寫了tostring方法,否則只會輸出其hashcode值。

4、定義logger變數為static

確保乙個物件只使用乙個logger物件,避免每次都重新建立,否則可能會導致oom。

5、正確使用日誌級別

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

6、推薦使用slf4j+logback組合

logback庫里自身就已經實現了slf4j的介面,就無需引入多餘的介面卡了,而且logback也具有更多的優點,建議新專案可以使用這個組合。

還有一點需要注意,當引入slf4j後,要注意其實際使用的日誌庫是否是由我們引入的,也有可能會使用了我們第三方依賴包所帶入的日誌庫,這樣就可能會導致我們的日誌失效。

7、日誌的聚合分析

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

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

結語

Java日誌正確使用姿勢

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

正確的打日誌姿勢

程式中記錄日誌一般有兩個目的 troubleshooting和顯示程式執行狀態。好的日誌記錄方式可以提供我們足夠多定位問題的依據。這周看過很多 對裡面的日誌記錄方式有些想法,今天是週末,也想總結下我對這個問題的看法。日誌記錄大家都會認為簡單,但如何通過日誌可以高效定位問題可不是簡單的事情。這裡我會寫...

logback打日誌正確姿勢

logback動態修改包名的日誌級別 param level 日誌級別 param packagename 包名 return public string updatelogbacklevel requestparam value level string level,requestparam va...