2010-12-07 76 views
16

我很好奇,爲什麼我看到有人寫日誌log4net的如下代碼:爲什麼在log4net中調用IsDebugEnabled?

if (_logger.IsDebugEnabled) 
{ 
    _logger.Debug("Some debug text"); 
} 

我已經通過拆裝log4net的走了,並呼籲調試使另一個調用相同的代碼,看是否它在實際記錄之前啓用,因此IsDebugEnabled調用是不必要的,實際上是重複的代碼。

有人有這樣的理由嗎?也許舊版本以前是必需的舊模式,但不再是?或者有沒有合法的理由呢?或者,也許人們不知道他們不需要這樣做?

這種行爲是有其他級別(信息,錯誤,警告,最好的,等等),以及。

+1

感謝你們三個人 - 看起來你們幾乎都在同一時間響起,但我認爲布賴恩是第一個。我沒有真正想過一個昂貴的消息 - 我通常做的任何日誌記錄都非常簡單,通常只是一個字符串。但是,如果你有真正的代碼啓動,就提前停止它,這絕對有意義。謝謝您的幫助。 – 2010-12-08 02:50:39

+0

有關IsDebug和性能問題,請參閱http://goo.gl/kMHNQ – sduplooy 2013-04-17 05:14:25

回答

12

該消息的構建可能很昂貴。將它包裝在if語句中可確保僅在必要時才創建它。

解決此問題的另一種模式是:

_logger.Debug(() => "Some expensive text"); 

我不知道,如果log4net的支持這樣的事情,雖然。

6

一定要對你做的計算或額外的檢查,以便能夠輸出所需的日誌消息的一些操作。

而不是做這些工作如果日誌級別設置比DEBUG有時可以更好地檢查更高,因此防止了額外的工作量,如果它不會仍記錄。

一個例子可以是網頁的加載時間,在調試模式下,他們可以登錄,但如果不是在DEBUG級別,秒錶不應該創建和計算應被跳過。

14

這種模式純粹是出於性能的考慮,特別是記錄到某個日誌級別時將被跳過,因爲日誌記錄級別當前未啓用。檢查布爾型IsDebugEnabled標誌並跳過方法調用要比調用帶有參數的Debug方法要便宜很多,並且該方法在不記錄日誌的情況下返回。

如果您要調用Debug方法並傳入包含創建成本較高的消息,則可以通過首先檢查啓用的標誌來完全跳過消息的創建。所有這些都說了,除非你製作的日誌消息非常昂貴(例如類似堆棧跟蹤的東西),或者你正在以緊密的循環登錄,否則它不太可能成爲你的瓶頸碼。