關於Java日誌的注意事項

2021-08-11 11:43:32 字數 1752 閱讀 2353

盡量使用slf4j或commons-logging等抽象日誌框架,而不是具體的 logging(jdk 自帶的)、log4j1、log4j2、logback等具體實現關鍵框架。這樣可以在保證不修改**的情況下,很方便的實現底層日誌框架的更換。

盡量使用slf4j,而不是commons-logging,推薦使用下面slf4j提供的第三種寫法。從可讀性和系統效率來說, slf4j比log4j都要優秀(log4j涉及到字串連線和tostring()方法的呼叫). 這裡的{}帶來的另乙個好處, 我們在盡量不損失效能的情況, 不必為了不同的日誌輸出級別, 而加上類似isdebugenabled()判斷.

第一種寫法:

log.debug("found " + records.keyset().tostring() + " records matching filter: '" + filter + "'");

缺點:當日誌級別提高到debug以上時,這條日誌不會輸出,但是records.keyset().tostring()仍然會進行,字串仍然會進行拼接

第二種寫法:

if(log.isdebugenabled())

log.debug("found " + records.keyset().tostring() + " records matching filter: '" + filter + "'");

缺點:雖然沒有第一種寫法的缺點,但是不專注於業務邏輯

log.debug("found {} records matching filter: '{}'", records.keyset().tostring(), filter);

不同的日誌框架有不同的日誌級別,但主要可以分為3類:

用於顯示除錯資訊,代表:debug,一般用於開發階段,給開發人員看的

用於顯示正常資訊,代表:info,一般用於線上正式環境,給運營和運維人員看的

用於輸出錯誤資訊,代表:error,可以用於所有環境,給開發或測試人員看的

slf4j的日誌級別如下表所示:

除錯資訊

正常資訊

錯誤資訊

trace、debuginfowarn、error

訊息的中重要程度從左往右遞進,常用的主要是debug、info和error這3個級別,也可以根據需要微調為trace和warn。

trace主要用來列印一些「蹤跡」,如函式間的相互呼叫關係,函式的引數和返回值等現場資訊;

warn主要用來列印一些「警告」,如函式引數傳入錯誤等,不會造成系統嚴重錯誤的警告資訊。

區分warn和error:

人為錯誤用warn:比如多個if條件,由於輸入的不同,當進入到某個if分支時,為了不讓程式繼續進行而丟擲異常,這裡可以用warn記錄。

系統錯誤用error:比如系統rpc遠端呼叫發生錯誤那不到資料,應該用error記錄。

使用者視角:把每乙個請求都當做是乙個人,這個人在系統裡經歷了什麼事。一般info級別。

系統視角:系統裡的每個模組都是乙個辦事處,每天都接待了哪些使用者,有哪些流水。一般debug級別。其中重要的部分也常用info級別。

[1] 正確使用日誌的10個技巧

[2] 關於日誌列印的幾點建議以及非最佳實踐

[3] 正確的打日誌姿勢

java注意事項

將int轉成byte inti 1 integer io newinteger i io.bytevalue split注意點 gson將物件轉換成json串時注意點 用gson將物件轉換成json串時,當物件是null或物件的某個屬性的值是null時,則json串中不會有這個物件或這個物件的某個屬...

Java繼承注意事項

錯誤寫法 class computer1 class computer2 如果想同時繼承兩個父類怎麼辦呢?class computer1 class computer2 extends computer1 class pad extends computer2 class computer1 cla...

java程式設計的注意事項

1.在繼承關係中子類方法的保護等級不能高於父類。2.foreach 迴圈在用於輸出時是沒有角標和計數器的,而是直接丟擲對應陣列元素。3.在迴圈中輸入比較條件是要使用比較運算子 而不能直接使用算數運算子。4.已經初始化的內容要想通過內部方法進行邏輯運算進行賦值時,要將運算方法新增到構造方法中。1.在同...