2016-03-03 64 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上下文(例如,如果有例外情况),则会自动启用它。)