Log4Net编程检查Appender过滤器的IsEnabledFor属性

3

我该如何以编程方式检查某个附加器过滤器的 IsEnabledFor 是否为 true

这是我的配置:

<log4net>
 <root>
  <level value="ALL" />
  <appender-ref ref="appender" />
 </root>

 <appender name="appender" type="log4net.Appender.FileAppender">
  <filter type="log4net.Filter.LevelRangeFilter">
   <levelMin value="ERROR" />
   <levelMax value="FATAL" />
  </filter>
 </appender>

<log4net>

如果我将<root>级别设置为ERROR,并使用IsEnabledFor(Debug)进行查询,它会返回true。但是,如果我将<root>级别设置为ALL,并在附加器中添加过滤器,则不会考虑这些过滤器。

如何包括附加器的过滤器,或者是否有其他方法可以查询这个问题?

2个回答

1

我可能错了,但我不认为这可以轻松地完成。你可以做的是像这样:

var hierarchy = LogManager.GetRepository() as Hierarchy;
if(hierarchy != null) 
{       
    var appenders = hierarchy.GetAppenders();
    foreach( IAppender appender in appenders)
    {
        var appenderSkeleton = a as AppenderSkeleton
        if (appenderSkeleton != null)
        {
            IFilter filterHead = appenderSkeleton.FilterHead;
            // now analyse the filter chain
        }        
    }
}

我没有测试过这段代码,但它应该运行得更或少。通过这种方式,您可以获取所有继承自AppenderSkeleton的附加器的配置过滤器链的头部。过滤器链的头部实现了IFilter(所有过滤器都是如此),它包含一个方法和一个属性:

FilterDecision Decide(LoggingEvent loggingEvent);   
IFilter Next { get; set; }

现在您可以创建一个具有您感兴趣的日志级别的 LoggingEvent 实例,并通过使用 Next 属性遍历过滤器链并通过调用 FilterDecision 测试每个过滤器。

这会告诉您应用程序记录器是否接受或拒绝了记录事件,但是您需要注意,记录器也可能基于其他标准(例如消息内容)进行过滤,因此它不完全是“IsEnabledFor”实现。


嗨,谢谢。是的,我看了一下,决定不走那条路。没有想到它可能会像IsEnabled一样容易。 - Pintac

1
我知道这是一篇旧帖子,但 Stefan 的回答帮助我构建了以下内容。我的用例是为给定操作的性能定义自定义日志级别。显然我们需要能够切换此级别。
在我的特定情况下,我们只使用 LevelMatchFilter,因此不会遇到其他过滤器类型可能遇到的问题...
    /// <summary>
    /// evaulates if a custom log level is enabled. 
    /// </summary>
    /// <param name="log"></param>
    /// <param name="level"></param>
    /// <returns></returns>
    public static bool IsLevelEnabled(this log4net.ILog log, log4net.Core.Level level)
    {
        var hierarchy = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;
        if (hierarchy != null)
        {
            var appenders = hierarchy.GetAppenders();
            foreach (log4net.Appender.IAppender appender in appenders)
            {
                var appenderSkeleton = appender as log4net.Appender.AppenderSkeleton;
                if (appenderSkeleton != null)
                {
                    log4net.Filter.IFilter filterHead = appenderSkeleton.FilterHead;
                    //traverse the filter chain
                    var currentFilter = filterHead;
                    while (currentFilter.Next != null)
                    {
                        if (currentFilter is log4net.Filter.LevelMatchFilter)
                        {
                            //if the filter level matches the target
                            if (((log4net.Filter.LevelMatchFilter)currentFilter).LevelToMatch == level)
                            {
                                return true;
                            }
                        }
                        //move to the next filter
                        currentFilter = currentFilter.Next;
                    }
                }
            }
        }
        return false;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接