2014-03-13 7 views
0

LogbackSMTPAppender과 함께 사용하려고 시도하고 있습니다. appender에 연결된 평가자가 기록되어 100 개의 오류가 기록 될 때마다 이메일이 전송됩니다. 대부분의 경우 올바르게 작동하지만 여러 전자 메일을 트리거하는 루프에서 오류가 빠르게 발생하면 올바른 전자 메일 만 마지막 전자 메일 만 보내집니다. 첫 번째 이메일이 작성/전송되는 것을 완료하지 않은 경합 조건 인 것으로 보이며, 두 번째 이메일은 작성시 첫 번째 이메일을 덮어 씁니다. 다른 사람이 이것을 경험했거나 해결책을 찾았습니까? 내 logback 설정은 아래에 첨부되어 있습니다. 어떤 도움을 주시면 더 좋구요Logback SMTPAppender가 마지막 전자 메일 만 보냄

public class CountingLoggerEvaulator extends EventEvaluatorBase<ILoggingEvent> implements EventEvaluator<ILoggingEvent> { 
    //if limit is not set in configuration, this will cause it to send one email for each message received. 
    private int limit = 100; 
    private int counter = 0; 

    public void setLimit(int limit) { 
     this.limit = limit; 
    } 

    public int getLimit() { 
     return limit; 
    } 

    @Override 
    public boolean evaluate(ILoggingEvent expr) throws NullPointerException, EvaluationException { 
     counter++; 
     if (counter == limit) { 
      counter = 0; 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

:

<configuration> 
    <appender name="emailAppender" class="${logback.emailAppenderClass}"> 
     <evaluator class="com.wdp.common.logging.logback.evaluators.CountingLoggerEvaulator"> 
      <limit>100</limit> 
     </evaluator> 
     <to>${logback.emailNotificationRecipientStr}</to> 
     <from>${logback.emailNotificationFromStr}</from> 
     <smtpHost>${logback.smtpHost}</smtpHost> 
     <subject>Logback logs for facebook-ads-processes</subject> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>ERROR</level> 
      <onMatch>ACCEPT</onMatch> 
      <onMismatch>DENY</onMismatch> 
     </filter> 
     <layout class="ch.qos.logback.classic.PatternLayout"> 
      <pattern>%d [Thread:%t] %p [%c] - %m%n</pattern> 
     </layout> 

      <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"> 
      <bufferSize>${logback.cyclicBufferSize}</bufferSize> 
     </cyclicBufferTracker> 
    </appender> 
</configuration> 

는 평가입니다.

답변

1

SMTPAppender의 asynchronousSending 속성의 기본값은 true입니다. 나는 false로 설정하고 제대로 작동

+1

속성을? – michael667

+0

감사합니다. 속성의 이름을 포함하도록 답을 편집했습니다. – jln646v

0

당신은 당신의 평가자 스레드를해야한다 - 예 AtomicInteger을 사용을 위해 :

public class CountingLoggerEvaulator extends EventEvaluatorBase<ILoggingEvent> implements EventEvaluator<ILoggingEvent> { 

    //if limit is not set in configuration, this will cause it to send one email for each message received. 
    private int limit = 100; 
    private AtomicInteger counter = new AtomicInteger(); 

    public void setLimit(int limit) { 
     this.limit = limit; 
    } 

    public int getLimit() { 
     return limit; 
    } 

    @Override 
    public boolean evaluate(ILoggingEvent expr) throws NullPointerException, EvaluationException { 
     int curValue = counter.incrementAndGet(); 
     if (curValue >= limit) { 
      return counter.compareAndSet(curValue, 0); 
     } else { 
      return false; 
     } 
    } 

}