Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Log4Net以编程方式检查Appender筛选器的IsEnabled_C#_Log4net_Log4net Configuration - Fatal编程技术网

C# Log4Net以编程方式检查Appender筛选器的IsEnabled

C# Log4Net以编程方式检查Appender筛选器的IsEnabled,c#,log4net,log4net-configuration,C#,Log4net,Log4net Configuration,如何以编程方式检查某个appender筛选器的IsEnablefor是否为true 这是我的配置: <log4net> <root> <level value="ALL" /> <appender-ref ref="appender" /> </root> <appender name="appender" type="log4net.Appender.FileAppender"> <filter

如何以编程方式检查某个appender筛选器的
IsEnablefor
是否为
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>

好的,如果我将
级别设置为
ERROR
,并执行
IsEnablefor
(调试),它将返回
true
,但如果我将
级别设置为
ALL
,并将过滤器添加到附录中,则不考虑过滤器


我如何让它包含appender过滤器,或者是否有其他方法来查询它?

我可能错了,但我不知道如何轻松做到这一点。你可以这样做:

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
派生的所有appender的任何配置过滤器链的头部。筛选器链的头实现了
IFilter
(与所有筛选器一样),它包含一个方法和一个属性:

FilterDecision Decide(LoggingEvent loggingEvent);   
IFilter Next { get; set; }
现在,您可以使用感兴趣的日志级别创建一个
LoggingEvent
实例,并使用
Next
属性遍历过滤器链,通过调用
FilterDecision
测试每个过滤器


这会告诉您appender是否会接受或拒绝日志事件,但您需要注意,appender也可能会根据其他条件(例如消息内容)进行过滤,因此它不会完全是“IsEnableFor”实现。

我知道这是一篇旧文章,但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;
    }
//
///如果启用了自定义日志级别,则进行评估。
/// 
/// 
/// 
/// 
公共静态bool IsLevelEnabled(此log4net.ILog日志,log4net.Core.Level)
{
var hierarchy=log4net.LogManager.GetRepository()作为log4net.Repository.hierarchy.hierarchy;
if(层次结构!=null)
{
var appenders=hierarchy.GetAppenders();
foreach(Appender中的log4net.Appender.iaappender Appender)
{
var appenderSkeleton=作为log4net.appender.appenderSkeleton的appender;
if(appenderSkeleton!=null)
{
log4net.Filter.IFilter filterHead=appenderSkeleton.filterHead;
//遍历过滤器链
var currentFilter=过滤头;
while(currentFilter.Next!=null)
{
if(currentFilter为log4net.Filter.LevelMatchFilter)
{
//如果筛选器级别与目标匹配
if(((log4net.Filter.LevelMatchFilter)currentFilter).LevelToMatch==level)
{
返回true;
}
}
//移动到下一个过滤器
currentFilter=currentFilter.Next;
}
}
}
}
返回false;
}

你好,谢谢。是的,我看到了,决定不走那条路。没想到这是可能的,也没想到这么简单。。。