2012-04-12 3 views
3

Как я могу программно проверить, является ли IsEnabledFor истинным для определенного фильтра appender.Log4Net программно проверяет IsEnabledFor для фильтров Appender

нормально это мой конфиг рода

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

Ok, так что если я установить корень> Уровень сказать ERROR и я делаю IsEnabledFor (Debug) она возвращает истину, но если я устанавливаю корень> уровень для всех и добавьте фильтры в приложение, не принимая во внимание фильтры. Итак, как мне заставить его включать фильтры appender или есть другой способ запросить это.

благодаря

ответ

0

Я мог бы быть неправильно, но я не вижу, как это можно сделать легко. Что вы могли бы сделать что-то вроде этого:

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

Привет спасибо. да смотрел на это и решил не идти по этому пути. Не думал, что это будет возможно или так просто, как IsEnabled ... – Pintac

1

Я знаю, что это старый пост, но ответ Стефана помог построить следующее. Моим вариантом использования был пользовательский уровень ведения журнала для выполнения определенных операций. Очевидно, нам потребовалась возможность переключения этого уровня.

В моем конкретном случае мы используем только 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; 
    } 
Смежные вопросы