2017-12-22 11 views
2

log4net 필터에서 작업하는 새로운 정보입니다. "레벨 범위, stringtomatch, LoggerMatchFilter"과 같은 나머지 필터를 사용해 보았지만 속성 필터가 제대로 작동하지 않습니다. 다른 솔루션을 시도해 보았지만 작동하지 않습니다.log4net.Filter.PropertyFilter가 작동하지 않습니다

여기 내 코드입니다 :

코드 : 나는 log4net filter - how to write AND filter to ignore log messages이 아니라 나를 인터페이스에 추가하지 필터이 솔루션을 보았다

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

} 

. 나는 필터을 직접 추가했는지 여부를 알지 못했습니까? 있음 loggingevent메시지 속성에 데이터를 전달하고 있지만 속성을 추가하는 방법을 모르겠지만 어느 누구도 나를 안내 할 수 없으며이 함수를 호출하는 방법을 모르겠습니다.

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> 

. 지난 몇 시간 동안 고생하고 있습니다.

업데이트 : filterskelton 그러나 속성 필터에서

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; 
    } 
여기

(결정) 기능 오버라이드 (override)하는은 수 webconfig에서 세부 사항을 읽어 적용되지하지만 필터링 할 수 없습니다 로그 메시지에는 내가 놓친 메시지가 있습니다.

미리 감사드립니다.

답변

0

필터 중 하나가 FilterDecision.Neutral을 반환하면 로그 메시지가 기록됩니다. 해당 메시지가

  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 함께 모든 필터를 통과 확인해야 그에 : 내 log4net의 설정은 다음과 같습니다

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

샘플 로깅에게

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

을 확인하는 방법 ** loggingEvent **는 null입니다. ** LoggingEvent **에 데이터를 할당하는 방법. ** LoggingEvent **에 데이터를 할당해야하는 속성과 필터도 null입니다. – prasanthi

+0

, 네임 스페이스 및 어셈블리를 자리 표시 자로 사용하고 싶습니다. 프로젝트에서 실제 코드 스냅이 아닙니다. –

+0

** NameSpace ** 대신 ** 코드의 ** CustomFilter ** 네임 스페이스를 유지했습니다. – prasanthi