2017-05-23 52 views
1

我正在嘗試使用slf4j + log4j2來評估我們的應用程序。我在這樣的有關參數信息的文件閱讀功能在SLF4J:https://www.slf4j.org/faq.html#logging_performance瞭解slf4j參數化消息

要理解這個功能我試過這段代碼:

int a = 10; 
logger.trace("test: " + a++); 
logger.error("value of a: " + a); 
logger.trace("test {}", a++); 
logger.error("value of a " + a); 

日誌記錄級別設置爲錯誤。因此,我假定在第一個跟蹤日誌中,'a'將會增加,因爲這是舊的低效率日誌記錄方式。但在第二次跟蹤日誌中,因爲我使用參數化日誌記錄,並且未啓用跟蹤級別,所以'a ++'也不會被評估。但看起來它正在被評估。我在2個錯誤日誌中將值看作11和12。

你能幫我理解看這個行爲的slf4j參數化消息嗎?

我使用SLF4J 1.6.4和log4j2.7

回答

0

看它是這樣的:將a變量在這段代碼遞增?

​​

答案是肯定的。

Log4j2或slf4j API沒有什麼魔力。在上面的例子,如果你只是想增加a變量時實際記錄的消息,你需要做的:

if (logger.isTraceEnabled()) { 
    logger.trace("test {}", a++); 
} 

故事略有不同,當你登錄的對象。使用參數化日誌記錄樣式,日誌記錄庫可以在格式化消息字符串之前首先檢查日誌級別。如果日誌級別未啓用,我們可以避免在參數對象上調用toString()

例如:

// always calls toString() on the parameter 
logger.trace("a time: " + LocalTime.now()); 

// only calls toString() if trace is enabled 
logger.trace("a time: {}", LocalTime.now()); 

其實,我說謊了一點。 slf4j API可能沒有任何魔力,但是Log4j2 API可以! :-)

使用Java的8 Log4j2 API,你可以有這樣的代碼:

logger.trace("test {}",() -> a++); 

這是如果啓用跟蹤日誌記錄只計算一個lambda表達式。所以你可以在一行中寫入以前需要3行的內容。

這是consider programming to the Log4j2 API而不是slf4j API的原因之一。

+0

非常感謝Remko ..ya的解釋,我早些時候看了你的其他文章並評估了log4j2 api。 – anuragz