2013-10-11 3 views
4

일부 지점에서 로그 메시지가 갑자기 나타납니다. 성능상의 이유로 BufferingForwardingAppender을 입력해야했습니다. 그러나이 버스트 (하루에 한 번씩)를 제외하고는 나머지 시간 동안 로그 메시지가 거의 표시되지 않습니다. 문제는 버퍼 크기가 50으로 설정되어 버스트 기간에는 정상이지만 버스트가없는 기간에는 너무 길다는 것입니다. 이 기간에는 로그를 플러시하는 데 1 ~ 2 시간 이상이 걸릴 수 있습니다. 이는이 시스템에서 용납 할 수 없습니다.log4net - BufferingForwardingAppender - 시간 초과로 플러시

일반적인 프로세스를 트리거하기에 충분한 메시지가 버퍼에없는 경우 BufferingForwardingAppender을 특정 시간 간격 (예 : 10 분마다)으로 플러시 할 수있는 방법이 있습니까?

답변

1

하지 상자 밖으로,하지만 당신은 BufferingForwardingAppender에 따라 자신의 펜더를 만들 수있다 : I (3 년) 도움이 좀 늦었

private static DateTime lastFlushTime = DateTime.Now; 
public class TimedBufferingForwardingAppender : BufferingForwardingAppender{ 
    override protected void Append(LoggingEvent loggingEvent) { 
     if (lastFlushTime.AddMinutes(10) < DateTime.Now){ 
      SendBuffer(new LoggingEvent[] { loggingEvent }); 
      lastFlushTime = DateTime.Now; 
     } 
    } 
} 
+0

새로운 이벤트가없는 경우에만 문제가 발생한다고 생각합니다.이 이벤트는 실행되지 않습니다. – Salgat

+0

네가 맞다. 그러나이 예제를 가지고 있다면 그것을 고칠 수있을 것이다. – Peter

2

추측하지만, 꽤 검색 한 후, I 다른 사람들이이 질문에 도달하는 데 도움이 될만한 것을 발견했습니다. 이것은 나를 위해 일한 :

<appender name="MyBufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender"> 
     <bufferSize value="1000" /> <!-- flush after 1000 log events --> 
     <appender-ref ref="MyRollingFileAppender" /> 
     <lossy value="false" /> <!-- do not lose any logs --> 
     <evaluator type="log4net.Core.TimeEvaluator"> 
     <interval value="2"/> <!-- flush every two seconds --> 
     </evaluator> 
</appender> 

영업 이익의 경우, 그 메시지를 10 분마다 로그인 할 <interval value="600"/>을 사용합니다.

+0

규칙을 잘 준수하고 규칙을 준수하는 한 여기서 대답 할 때 문제가되지 않습니다. –

+0

이것은 또한 10 분 후에 새로운 이벤트가 오지 않으면 로그가 결코 플러시되지 않는다는 문제가 있습니다 ... –

+0

@ bastos.sergio 그렇지 않습니다. 특정 간격의 TimeEvaluator는 해당 간격이 경과 한 후에 플러시를 강제 실행합니다. 적어도이 대답을 게시했을 때 나를 위해 않았다 –