2013-12-17 49 views
3

在記錄器的情況下,它表示對於每個記錄器都存在隱含的參數構造成本。log4j v2格式化功能

例如: -

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); 

這招致構造的消息參數,即兩個整數變換i和條目[I]爲字符串,和連接中間的字符串,成本不管該消息是否將記錄與否。參數構建的成本可能相當高,並且取決於涉及參數的大小。

在log 4j網站上,給出了避免參數構造成本的最佳方法是使用Log4j 2的格式化功能。例如,而不是上面寫道:

logger.debug("Entry number: {} is {}", i, entry[i]); 

這個格式化功能發生了什麼,這次花費的時間會少一些。它是不是創建像以前的情況下創建的字符串。請有人解釋這一點?

回答

1

在第一個示例中,即使不需要它也會創建該字符串。但是,如果需要,這可能是最有效的方法。順便說一句String.valueOf是多餘的。

如果關閉該消息,則第二種選擇更快。這避免了創建一個字符串,該字符串稍後會被丟棄,因爲它可以在構建字符串之前檢查是否啓用調試。注意:如果你確實需要字符串,它可能會比較慢,因爲它必須解析消息格式。

兩全其美,但wordest是

if(logger.isDebugEnabled()) 
    logger.debug("Entry number: " + i + " is " + entry[i]); 

在這種情況下,你做的檢查,如果是要記錄,獲得最快的信息產生。


有記錄其避免產生任何字符串和速度夠快,你不需要把擺在首位調試過的框架,但這些都不是簡單的使用,我會避開它們,除非你需要更多的性能。

+0

以及我的第一個查詢是關於在第二個選項中使用的更改的方法,其中我們在logger.debug中傳遞3個參數該方法如何處理這些參數。 log4j v2 格式化功能的新功能其次,你的意思是說,在創建參數記錄器之前的第二種情況下,將檢查調試模式是否啓用。 –