2013-02-01 225 views
0

我在打印消息時這樣我調試消息評估昂貴的字符串操作:日誌和調試消息

Log.Debug("here it is" + obj.ExpensiveToString())

現在,即使日誌級別未設置爲Debug,它仍評估昂貴串操作。

所以不必這樣做:

if(debugMode) Log.Debug("here it is" + obj.ExpensiveToString())

或有大量的複雜Log.Debug()方法,我怎麼能解決這個問題?

+1

如果您正在使用log4net的,最好是添加標籤對你的問題。專家會更快地注意到它。 – Steve

+0

我認爲它總是會評估該表達式而不考慮配置,因爲obj.ExpensiveToString()作爲函數的參數,並且爲了調用該函數必須對其進行評估。他們只能檢查配置時,它進入函數調用 –

+1

@Steve我不使用log4net – Cheetah

回答

3

使用編譯器指令

#if DEBUG 
    Log.Debug("Here it is: "+obj.ExpensiveToString()); 
#endif 

,因爲這些指令提高代碼的詳細程度使用它們的昂貴的部件。

另一種方法是修改或補充您的日誌系統接受Func<string>

public void LogDebug(Func<string> evalMe){ 

#if DEBUG 
    if (evalMe!=null) 
     Log.Debug(evalMe); 
#endif 

} 

,然後調用它像這樣:

LogDebug(()=>"Here it is: "+obj.ExpensiveToString()); 
+0

這是一個有趣的解決方案,但肯定'趣味'增加了自己的開銷? – Cheetah

+0

Func <>只會作爲編譯運行時代碼的「指針」攜帶,因此不會在DEBUG模式下進行評估,所以開銷非常小,並且與其他任何類型的參數一樣。例如,添加'if(debugMode)'可能會慢一點點 –

+0

不喜歡編譯器指令的想法。這意味着你不能僅僅通過編輯一個配置文件來改變日誌級別,而是必須發佈一個新的調試版本。使用函數參數 – sgmoore