Log4Net programmatically checks IsEnabledFor filters for Appender

How do I programmatically check if IsEnabledFor is true for a specific appender filter.

ok this is my configuration type

<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>

So, if I set root> Level to say ERROR, and I do IsEnabledFor (Debug), it returns true, but if I set root> level to All and add filters to the appender, this will not take into account the filters. So, how do I get it to enable appender filters or is there another way to request this.

thank

+3
source share
2 answers

I could be wrong, but I do not understand how this can be done easily. What you can do is something like this:

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.

, appender , , (, ), , , "IsEnabledFor".

0

, , . . , .

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;
    }
+1

All Articles