2017-01-16 1 views
0

중복 메시지를 제거하기 위해 log4net을 설정할 수있는 옵션이 있습니까? 사이클에서 작동하는 응용 프로그램이 있습니다 ...주기가 무한합니다. 오류가 발생하면 (예 : 데이터베이스에 액세스 할 수없는 경우) 동일한 메시지가 모든 루프에 반복해서 기록됩니다. 메시지를 한 번만 기록해야합니다.Log4net, 중복 메시지 제거

답변

0

log4net 필터를 구현하여 지정된 시간 간격 동안 동일한 메시지를 제거했습니다.

클래스 :

public class DuplicityFilter : FilterSkeleton 
{ 
    private String lastMessage = null; 
    private List<Tuple<DateTime, String>> lastMessages = new List<Tuple<DateTime,string>>(); 

    private Int32 _timeWindow = 0; 
    public Int32 timeWindow 
    { 
     get { return _timeWindow; } 
     set { _timeWindow = value; } 
    } 

    public Boolean _lastOnly = false; 
    public Boolean lastOnly 
    { 
     get { return _lastOnly; } 
     set { _lastOnly = value; } 
    } 

    public override FilterDecision Decide(log4net.Core.LoggingEvent loggingEvent) 
    { 
     if (_lastOnly) 
     { 
      if (lastMessage == loggingEvent.RenderedMessage) 
      { 
       return FilterDecision.Deny; 
      } 
      else 
      { 
       lastMessage = loggingEvent.RenderedMessage; 
       return FilterDecision.Accept; 
      } 
     } 
     else 
     { 
      if (_timeWindow <= 0) 
       return FilterDecision.Accept; 

      // Removes old messages 
      lastMessages.RemoveAll(m => m.Item1 < DateTime.Now.AddSeconds(0 - _timeWindow)); 

      if (!lastMessages.Any(m => m.Item2 == loggingEvent.RenderedMessage)) 
      { 
       lastMessages.Add(new Tuple<DateTime, string>(loggingEvent.TimeStamp, loggingEvent.RenderedMessage)); 
       return FilterDecision.Accept; 
      } 
      else 
      { 
       return FilterDecision.Deny; 
      } 
     } 
    } 

그리고 XML 정의 :

<filter type="your.namespace.here.DuplicityFilter"> 
    <timeWindow value="900" /> <!-- 15min --> 
    <lastOnly value="false" /> 
    </filter>