2011-08-17 66 views
3

我正在考慮將java 1.4.2項目從log4j遷移到slf4j。這是參數化日誌記錄和代碼清晰度的優點(如果使用log.isdebug,則不需要)。這引起我的注意。使用slf4j與log4j和單獨使用log4j是否有任何性能開銷?

是否有轉換爲slf4j的性能開銷?

上次我檢查了是否可以使用logback,它對jdk的要求至少是1.5,這就是爲什麼我正在考慮slf4j和log4j。

+1

你有這麼一些性能測試和比較結果嗎? –

+0

logback可以反編譯爲1.4。我這樣做,它的工作,但我會建議廣泛的測試是肯定的。請注意,您也可以使用slf4j標準的JDK14日誌記錄。 –

回答

9

不,你應該從SLF4J獲得性能上的優勢,如果有的話,因爲(如果你使用參數化的消息),然後slf4j defers turning its parameters to strings until it has checked that the message won't be filtered out by log level

存在着基於消息的格式非常方便的選擇。假設入口是一個對象,你可以寫:

Object entry = new SomeObject(); 
logger.debug("The entry is {}.", entry); 

評估是否記錄或沒有,只有當決定是肯定的,將記錄器執行格式化消息並更換後的「{} '與條目的字符串值配對。換句話說,這種形式在日誌語句被禁用的情況下不會產生參數構造的成本。

以下兩行將產生完全相同的輸出。但是,如果禁用日誌記錄聲明,第二種形式的表現將優於第一種形式至少30。

logger.debug("The new entry is "+entry+"."); 
logger.debug("The new entry is {}.", entry); 
+0

這是Logback,而不是slf4j? – Goibniu

+0

@Rulmeq:這是slf4j,我添加了一個鏈接到文檔 –

+1

謝謝,我一直認爲你需要logback,所以我一直在避免遷移到SL4J(不能真正使用0.x生產中的任何東西,不用花費你的生命向上級解釋)。這是個好消息:) – Goibniu