2017-12-22 10 views
2

Ich bin neu zu Logger Arbeiten an log4net Filter Ich habe versucht, verbleibende Filter wie "Level-Bereich, , LoggerMatchFilter" alle funktionieren gut aber Eigenschaft Filter funktioniert nicht. Ich habe verschiedene Lösungen ausprobiert und es funktioniert auch nicht.log4net.Filter.PropertyFilter funktioniert nicht

Hier ist mein Code:

Code:

public class CustomFilter : FilterSkeleton 
{ 
    private bool acceptOnMatch; 
    private readonly IList<IFilter> filters = new List<IFilter>(); 

    public override FilterDecision Decide(LoggingEvent loggingEvent) 
    { 
     if (loggingEvent == null) 
      throw new ArgumentNullException("loggingEvent"); 

     foreach (IFilter filter in filters) 
     { 
      if (filter.Decide(loggingEvent) != FilterDecision.Accept) 
       return FilterDecision.Neutral; // one of the filter has failed 
     } 

     // All conditions are true 
     if (acceptOnMatch) 
      return FilterDecision.Accept; 
     else 
      return FilterDecision.Deny; 
    } 

    public IFilter Filter 
    { 
     set { filters.Add(value); } 
    } 

    public bool AcceptOnMatch 
    { 
     get { return acceptOnMatch; } 
     set { acceptOnMatch = value; } 
    } 

} 

ich diese Lösung in log4net filter - how to write AND filter to ignore log messages gesehen, aber für mich Hinzufügen von Filtern nicht zu Schnittstelle. Ich habe nicht bekommen, ob Filter direkt oder nicht hinzugefügt werden? In loggingevent übergebe ich die Daten in Nachricht Eigentum, aber die ich weiß nicht, wie man die in Eigenschaften hinzufügen kann jemand bitte führen Sie mich, und ich weiß nicht, wie man diese Funktion nennt.

Webconfig:

<filter type="Namespace.CustomFilter, Assembly"> 
    <filter type="log4net.Filter.PropertyFilter"> 
     <key value="firstname" /> 
     <stringToMatch value="1234" /> 
    </filter> 
    <filter type="log4net.Filter.PropertyFilter"> 
     <key value="address" /> 
     <stringToMatch value="abcdf" /> 
    </filter> 
    <acceptOnMatch value="false" /> 
    </filter> 

ich verpasst haben einige, wo mir bitte von ihm helfen. Ich kämpfe seit einigen Stunden.

Update:

public string logFilter() 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     ILog Log = LogManager.GetLogger(
      System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 
      ); 

     var ReferenceID = Guid.NewGuid().ToString(); 

     var firstname = "1234"; 
     var address ="abcdf"; 
     var sno = "12"; 

     Log.InfoFormat("firstname {0}-{1}", firstname, ReferenceID); 

     Log.InfoFormat("address {0}-{1}", address, ReferenceID); 

     Log.InfoFormat("sno {0}-{1}", sno, ReferenceID); 

     return ReferenceID; 
    } 

Hier entscheiden() Funktion overide von filterskelton aber Eigenschaftsfilter bewirbt sich nicht der Lage, die Details von webconfig zu lesen, aber es kann das nicht filtern Log-Nachricht gibt es etwas, was ich darin verpasst habe.

Vielen Dank im Voraus!

Antwort

0

wenn eines der Filter liefert FilterDecision.Neutral dann wird der Protokollnachricht protokolliert. Daher Sie diese Nachricht zusammen durch alle Filter geht überprüfen müssen

  public override FilterDecision Decide(LoggingEvent loggingEvent) 
      { 
       if (loggingEvent == null) 
        throw new ArgumentNullException("loggingEvent"); 

       if (filters.All(x => x.Decide(loggingEvent) != FilterDecision.Accept)) 
       { 
        return FilterDecision.Neutral; 
       } 

       // All conditions are true 
       if (acceptOnMatch) 
        return FilterDecision.Accept; 
       else 
        return FilterDecision.Deny; 
      } 

UPDATE: meine log4net Config so aussieht:

<filter type="MyApp.CustomFilter, MyApp"> 
      <filter type="log4net.Filter.PropertyFilter"> 
       <key value="firstname" /> 
       <stringToMatch value="1234" /> 
      </filter> 
      <filter type="log4net.Filter.PropertyFilter"> 
       <key value="address" /> 
       <stringToMatch value="abcdf" /> 
      </filter> 
      <acceptOnMatch value="false"/> 
      </filter> 
     </appender> 

die Probe, wie die Protokollierung

Task.Run(() => 
    { 
     log4net.ThreadContext.Properties["firstname"] = "123"; 
     Log.Info("123"); 
    }); 

    Task.Run(() => 
    { 
     log4net.ThreadContext.Properties["firstname"] = "1234"; 
     Log.Info("1234"); 
    }); 

    Task.Run(() => 
    { 
     log4net.ThreadContext.Properties["address"] = "abcdf"; 
     Log.Info("abcdf"); 
    }); 
+0

überprüfen ** loggingEvent ** ist null. Wie weisen Sie die Daten ** LoggingEvent ** zu? Zu welcher Eigenschaft muss ich die Daten in ** LoggingEvent ** zuweisen und filtere auch null. – prasanthi

+0

Ich möchte klarstellen, , Namespace und Assembly, die Sie als Platzhalter verwenden? es ist kein echter Code-Snap von Ihrem Projekt –

+0

An Stelle von ** NameSpace ** behielt ich den Namensraum des ** CustomFilter ** in meinem Code. – prasanthi