2016-03-03 65 views
0

我有一個多線程的應用程序,我想暫時關閉特定線程中的調試日誌記錄,同時它執行一些日誌堵塞工作,而不影響其他線程。這可以做到嗎?log4net暫時禁用線程內的調試日誌

我們的課程通過

private static readonly ILog Logger = LoggerUtil.GetLogger(); 

public static class LoggerUtil 
{ 
    public static ILog GetLogger() 
    { 
     var type = ReflectionUtil.GetCallingMethod().DeclaringType; 
     return LogManager.GetLogger(type); 
    } 
} 

UPDATE檢索其記錄儀:現在,我創建了各地LogManager.GetLogger(類型)的裝飾.Logger和ThreadStatic IsDebugEnabled變量。這樣,兩個線程可以利用相同的工具類,一個將調試,另一個不會。這是有問題的,因爲它與調用的類和行號食堂......

public void Debug(object message) 
    { 
     if (_decorated.IsDebugEnabled && LoggerUtil.IsDebugEnabled) 
     { 
      _decorated.Log(typeof (MyLoggerDecorator), Level.Debug, message, null); 
     } 
    } 
+0

本機上,您無法通過線程禁用它。您可以在配置中爲每個記錄器設置規格。如果你知道你的多線程代碼總是使用1個記錄器(不共享),那麼你可以指定完全忽略該記錄器或不記錄調試。其他選項很難讓您看到代碼的結構。我能想到的唯一的其他選擇是在調用周圍創建自己的包裝器或攔截器,並添加掛起消息並根據線程ID或其他上下文恢復它們的功能。 – Igor

+0

如果您有一個線程記錄器 - 通過將threadId添加到記錄器名稱 - 那麼您可以更改該特定appender的日誌級別。但是,您需要再次將其更改回來,因爲記錄器在threadId被重用時將被重用。 – stuartd

回答

0

你可以寫自己的自定義IFilter實現其看了ThreadStatic變量。

(我可能還可以創建一個IDisposable的實現,該變量設置爲true,在構造函數中,並將其設置爲false在Dispose()方法,讓你換你的代碼在using塊與,讓你重新如果彈出using上下文(例如,如果有例外情況),則會自動啓用它。)