2012-04-12 13 views
3

Wie überprüfe ich programmatisch, ob IsEnabledFor für einen bestimmten Appender-Filter wahr ist.Log4Net programmatisch prüfen IsEnabledFor für Appender Filter

ok das ist meine Config Art

<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, so, wenn ich root set> Level-Fehler zu sagen, und ich habe eine IsEnabledFor (Debug) es gibt true zurück, aber wenn ich gesetzt root> Ebene für alle und Fügen Sie dem Appender Filter hinzu, ohne die Filter zu berücksichtigen. Also, wie bekomme ich es, Appender-Filter einzuschließen oder gibt es eine andere Möglichkeit, dies abzufragen.

dank

Antwort

0

Ich könnte falsch sein, aber ich sehe nicht, wie dies leicht getan werden kann. Was Sie tun können, ist so etwas wie dieses:

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

Ich habe diesen Code nicht testen, aber es sollte mehr oder weniger arbeiten. Was Sie auf diese Weise erhalten, ist der Kopf einer konfigurierten Filterkette für alle Appender, die von AppenderSkeleton abgeleitet sind. Der Leiter der Filterkette implementiert IFilter (wie alle Filter) und enthält ein Verfahren und eine Eigenschaft:

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

Nun könnte man eine Instanz eines LoggingEvent mit der Protokollebene erstellen Sie interessiert sind, und gehen durch die Filterkette mit der Eigenschaft Next und testen Sie jeden Filter durch den Aufruf FilterDecision.

Dies teilt Ihnen mit, ob der Appender das Protokollierungsereignis akzeptieren oder ablehnen würde, aber Sie müssen wissen, dass ein Appender auch nach anderen Kriterien filtern kann (zB Nachrichteninhalt) und somit nicht "IsEnabledFor" wäre Implementierung.

+0

Hallo Dank

In meinem speziellen Fall verwenden wir nur die LevelMatchFilter so würden wir in die Probleme nicht ausgeführt werden. Ja, sah sich das an und beschloss, diesen Weg nicht zu gehen. Dachte nicht, es wäre möglich oder so einfach wie IsEnabled ... – Pintac

1

Ich weiß, das ist ein alter Beitrag, aber Stefan's Antwort half, das folgende zu konstruieren. Mein Anwendungsfall war eine benutzerdefinierte Protokollierungsstufe für die Ausführung bestimmter Vorgänge. Offensichtlich mussten wir diese Ebene umschalten. Sie würde mit den anderen Filtertypen ...

/// <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; 
    } 
Verwandte Themen