我在打印消息時這樣我調試消息評估昂貴的字符串操作:日誌和調試消息
Log.Debug("here it is" + obj.ExpensiveToString())
現在,即使日誌級別未設置爲Debug
,它仍評估昂貴串操作。
所以不必這樣做:
if(debugMode) Log.Debug("here it is" + obj.ExpensiveToString())
或有大量的複雜Log.Debug()
方法,我怎麼能解決這個問題?
我在打印消息時這樣我調試消息評估昂貴的字符串操作:日誌和調試消息
Log.Debug("here it is" + obj.ExpensiveToString())
現在,即使日誌級別未設置爲Debug
,它仍評估昂貴串操作。
所以不必這樣做:
if(debugMode) Log.Debug("here it is" + obj.ExpensiveToString())
或有大量的複雜Log.Debug()
方法,我怎麼能解決這個問題?
使用編譯器指令
#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());
如果您正在使用log4net的,最好是添加標籤對你的問題。專家會更快地注意到它。 – Steve
我認爲它總是會評估該表達式而不考慮配置,因爲obj.ExpensiveToString()作爲函數的參數,並且爲了調用該函數必須對其進行評估。他們只能檢查配置時,它進入函數調用 –
@Steve我不使用log4net – Cheetah