如何以编程方式检查某个附加过滤器的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(调试),它将返回true,但是如果我将<root>级别设置为ALL并将过滤器添加到附加器中,则不会考虑过滤器。

如何获取包含附加过滤器的信息,或者还有另一种查询方式?

最佳答案

我可能是错的,但我不知道如何轻松地做到这一点。您可以做的是这样的:

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”实现。

关于c# - Log4Net以编程方式检查IsEnabledFor是否有Appender筛选器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10124896/

10-10 07:25