C# log4net暂时禁用线程内的调试日志记录

C# log4net暂时禁用线程内的调试日志记录,c#,log4net,C#,Log4net,我有一个多线程的应用程序,在其中我想暂时关闭调试日志记录,在特定的线程中进行一些日志记录阻塞工作,而不影响其他线程。这能做到吗 我们的类通过 private static readonly ILog Logger = LoggerUtil.GetLogger(); public static class LoggerUtil { public static ILog GetLogger() { var type = ReflectionUtil.GetCalli

我有一个多线程的应用程序,在其中我想暂时关闭调试日志记录,在特定的线程中进行一些日志记录阻塞工作,而不影响其他线程。这能做到吗

我们的类通过

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

public static class LoggerUtil
{
    public static ILog GetLogger()
    {
        var type = ReflectionUtil.GetCallingMethod().DeclaringType;
        return LogManager.GetLogger(type);
    }
}
更新:现在,我围绕LogManager.GetLogger(type).Logger和ThreadStatic IsDebugEnabled变量创建了一个Decorator。通过这种方式,两个线程可以利用同一个实用程序类,一个进行调试,另一个不进行调试。这是有问题的,因为它会干扰调用类和行号

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

您可以编写自己的自定义
IFilter
实现,该实现查看
ThreadStatic
变量


(我可能还会创建一个IDisposable实现,在构造函数中将变量设置为true,在
Dispose()中将变量设置为false)
方法,因此您可以使用该方法将代码包装在
块中,这样当您使用
上下文弹出该
块时,您可以自动重新启用它。

本机无法通过线程禁用它。您可以在配置中为每个记录器设置规格。如果您知道您的多线程代码始终使用1个记录器(未共享),则可以指定完全忽略该记录器或不进行日志调试。其他选项很难给出,因为看不到代码的结构。我能想到的唯一其他选择是围绕调用创建自己的包装器或拦截器,并添加暂停消息和基于线程id或其他上下文恢复消息的功能。如果每个线程都有一个记录器,比如说,将线程id添加到记录器名称中,则可以更改特定附加器的日志级别。但是,您需要再次更改它,因为当threadId被重用时,记录器将被重用。