log4net 暂时禁用线程中的调试日志记录

本文关键字:调试 日志 记录 线程 log4net | 更新日期: 2023-09-27 18:37:11

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

我们的类通过以下方式检索他们的记录器

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 变量。 这样,两个线程可以利用相同的实用程序类,一个将调试,一个不会。 这是有问题的,因为它弄乱了调用类和线路号...

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

log4net 暂时禁用线程中的调试日志记录

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

(我可能还会创建一个 IDisposable 实现,该实现在构造函数中将变量设置为 true,并在 Dispose() 方法中将其设置回 false,因此您将代码包装在 using 块中,以便在弹出该using上下文时自动重新启用它,例如,如果有异常。