我有一個關於性能的問題log4j日誌,在我的項目中,我在類中看到很多日誌消息。在生產環境中,日誌不打印許多這些(正常的行爲)。無論如何,每個日誌都會創建一個字符串對象。例如:Log4j性能和對象創建
Log.debug("This my debug message 1");
...
Log.debug("This my debug message 400");
我們爲日誌創建了很多字符串文字。這對我的生產現場是否會有相當大的影響,即使我只顯示錯誤級別?
由於
我有一個關於性能的問題log4j日誌,在我的項目中,我在類中看到很多日誌消息。在生產環境中,日誌不打印許多這些(正常的行爲)。無論如何,每個日誌都會創建一個字符串對象。例如:Log4j性能和對象創建
Log.debug("This my debug message 1");
...
Log.debug("This my debug message 400");
我們爲日誌創建了很多字符串文字。這對我的生產現場是否會有相當大的影響,即使我只顯示錯誤級別?
由於
固定字符串文字是沒有問題的,存在與該相關聯的(除了該方法調用自身)沒有運行時開銷。
不同的情況下構造消息如"user: " + user
。即使日誌未處於活動狀態,字符串連接也會完成。
它可以,如果構造日誌字符串相當複雜(例如調用一個對象上的複雜toString
)。
在你的情況(簡單的字符串日誌),它可能不值得寫保護:
if (Log.isDebugEnabled()) {
Log.debug("...");
}
這是一個性能問題,基本上沸騰降至:衡量它! 我們不知道有多少「很多」的日誌消息,你的其他代碼的價格是多少等等。太多的因素給出了一個很好的答案。
我覺得一般的理解是,在大多數情況下合理的日誌報表應該不會影響性能顯着和它的便宜,使用更快的硬件比具有開發刪除日誌報表。但是這可能不包括你的具體情況。
記錄能得到貴了不少,如果日誌消息是不是文字但生成的字符串(字符串連接或複雜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());
}
OP正在談論_string literals_,雖然你的提示是正確的。 – Seelenvirtuose
這就是爲什麼大多數較新的日誌框架(例如Log4J 2.x)允許格式模板樣式消息:'logger.debug(「Entry number:{} is {}」,i,entry [i]);'。如果你可以用這種方式生成你的日誌消息,那麼這可能是一條可行的路(減少混亂 - 仍然是一行代碼)。 – sruetti
使用警衛爲簡單的日誌語句沒有任何意義。當日志處於不活動狀態時,只需將一個方法調用替換爲另一個方法調用即可,當日志處於活動狀態時,將執行兩次調用而不是一次調用 – Henry