2017-03-16 25 views
0

我有一個關於性能的問題log4j日誌,在我的項目中,我在類中看到很多日誌消息。在生產環境中,日誌不打印許多這些(正常的行爲)。無論如何,每個日誌都會創建一個字符串對象。例如:Log4j性能和對象創建

Log.debug("This my debug message 1"); 
... 
Log.debug("This my debug message 400"); 

我們爲日誌創建了很多字符串文字。這對我的生產現場是否會有相當大的影響,即使我只顯示錯誤級別?

由於

回答

0

固定字符串文字是沒有問題的,存在與該相關聯的(除了該方法調用自身)沒有運行時開銷。

不同的情況下構造消息如"user: " + user。即使日誌未處於活動狀態,字符串連接也會完成。

2

它可以,如果構造日誌字符串相當複雜(例如調用一個對象上的複雜toString)。

在你的情況(簡單的字符串日誌),它可能不值得寫保護:

if (Log.isDebugEnabled()) { 
    Log.debug("..."); 
} 

http://logging.apache.org/log4j/1.2/manual.html(底部「性能」一節)

+0

OP正在談論_string literals_,雖然你的提示是正確的。 – Seelenvirtuose

+1

這就是爲什麼大多數較新的日誌框架(例如Log4J 2.x)允許格式模板樣式消息:'logger.debug(「Entry number:{} is {}」,i,entry [i]);'。如果你可以用這種方式生成你的日誌消息,那麼這可能是一條可行的路(減少混亂 - 仍然是一行代碼)。 – sruetti

+0

使用警衛爲簡單的日誌語句沒有任何意義。當日志處於不活動狀態時,只需將一個方法調用替換爲另一個方法調用即可,當日志處於活動狀態時,將執行兩次調用而不是一次調用 – Henry

0

這是一個性能問題,基本上沸騰降至:衡量它! 我們不知道有多少「很多」的日誌消息,你的其他代碼的價格是多少等等。太多的因素給出了一個很好的答案。

我覺得一般的理解是,在大多數情況下合理的日誌報表應該不會影響性能顯着和它的便宜,使用更快的硬件比具有開發刪除日誌報表。但是這可能不包括你的具體情況。

記錄能得到貴了不少,如果日誌消息是不是文字但生成的字符串(字符串連接或複雜toString() - 方法。)有豐富的信息,看手冊的性能部分爲log4j 1.x.log4j 2.x

刪除日誌語句可能是premature optimization的情況下,儘管它是沒有任何錯誤儘量減少開銷(至少在臨界區)。 Log4j中可以做到這一點(的建議):

  • 使用格式模板樣式消息(因爲log4j的2.0提供):

    logger.debug("Entry number: {} is {}", i, entry[i]); 
    
  • 使用警衛

    if (logger.isDebugEnabled()) { 
        logger.debug(expensiveMethodReturningLogString()); 
    }