如何检查appender是否被禁用/启用

时间:2012-09-05 20:22:56

标签: c# logging log4net

是否可以确定appender是否被禁用(即<level value="Off">)?

我想要一个全局标志来确定我的appender是否已启用:

public static bool isAppenderEnabled = /*...*/;

如果appender已启用,那么我会记录内容:

if(isAppenderEnabled)
{
    MyAppender.Warn("****************************************");
    MyAppender.Warn("Warning title!");
    MyAppender.Warn(String.Format("Some warning message! A:{0}, B:{1}, C:{2}, D:{3}", 0, 1, 2, 3));
    MyAppender.Warn("****************************************");
}

拥有isAppenderEnabled标志很重要,因为由于我没有构建所有这些字符串,所以当appender被禁用时,我将节省大量的CPU时间。检查appender是否关闭的最佳/最简单方法是什么?

P.S。 我已经尝试了MyAppender.Logger.IsEnabledFor(log4net.Core.Level.Off);,但是,如果我将日志级别设置为Warn,它总是会为Off返回true(基本上,它总是说记录器已被禁用),所以这样做不行。

2 个答案:

答案 0 :(得分:1)

建议的做法是,不是要有一个全局标志来说明是否启用了日志记录,而是测试每次调用的实际日志记录级别, 例如

if (MyAppender.IsWarnEnabled)
{
    MyAppender.Warn(String.Format("Some warning message! A:{0}, B:{1}, C:{2}, D:{3}", 0, 1, 2, 3));
}

...

if (MyAppender.IsDebugEnabled)
{
    MyAppender.Debug(String.Format("Some debug info! A:{0}, B:{1}, C:{2}, D:{3}", 0, 1, 2, 3));
}

...

if (MyAppender.IsErrorsEnabled)
{
    MyAppender.Error(String.Format("Some error message! A:{0}, B:{1}, C:{2}, D:{3}", 0, 1, 2, 3));
}

此方法的优点是您可以设置日志并将其保留为Level.Error或Level.Fatal,而无需构建warn / debug和info消息中的所有字符串。

话虽如此,这是你的选择。要回答您的问题,请MyAppender.Logger.IsEnabledFor(log4net.Core.Level.Off); 不起作用,如果级别设置为x 或更高,MyAppender.Logger.IsEnabledFor(x)将返回true。因此,我希望此调用始终返回true。

下一级是(AFAIK)log4net.Core.Level.Emergency因此可以检查,但由于该级别不常用,您还可以检查log4net.Core.Level.Fatal

MyAppender.IsFatalEnabled只是MyAppender.Logger.IsEnabledFor(log4net.Core.Level.Fatal)

的属性包装器

答案 1 :(得分:0)

根据我对log4j所基于的log4j的理解,您可以通过调用来检查LOGGER是否配置了您感兴趣的级别:

logger.isEnabledFor(Priority.WARN)  // or whatever log priority you want

没有任何东西可以告诉appender是否已启用。但是,您可以检查是否为您的记录器分配了给定的命名appender。你会检查:

if(logger.getAppender("MyAppender") == null)