2013-05-30 19 views
9

Oto fragment zawierający moje Logback SMTPAppender:Dlaczego firma Logback SMTPAppender wysyła tylko 1 wiadomość e-mail?

<appender name="logManager-smtpAppender" class="ch.qos.logback.classic.net.SMTPAppender"> 
    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>WARN</level> 
     <onMatch>ACCEPT</onMatch> 
     <onMismatch>NEUTRAL</onMismatch> 
    </filter> 
    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>ERROR</level> 
     <onMatch>ACCEPT</onMatch> 
     <onMismatch>DENY</onMismatch> 
    </filter> 

    <asynchronousSending>false</asynchronousSending> 

    <smtpHost>my.smtp.host</smtpHost> 
    <to>[email protected]</to> 
    <from>[email protected]</from> 
    <username>my_smtp_user</username> 
    <password>my_smtp_password</password> 
    <subject>%logger{20} - %m</subject> 
    <layout class="ch.qos.logback.classic.html.HTMLLayout"/> 
    <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"> 
     <bufferSize>1</bufferSize> 
    </cyclicBufferTracker> 
</appender> 

Kiedy wykonuje następujące Java:

logger.warn("This is a warning."); 
logger.error("This is an error."); 

mam tylko 1-mail. Ustawiając bufferSize na 1, oczekiwałbym, że otrzymam 2 różne e-maile z 1 pojedynczym logiem w każdym z nich. Co się dzieje?

Odpowiedz

8

Jak już wspomniał Ceki, SMTPAPpender uruchamia wiadomości e-mail o zdarzeniach poziomu ERROR. Aby uzyskać wszystkie dzienniki w jednym elektroniczną, można zwiększyć BUFFERSIZE

Tu zwiększając BUFFERSIZE do 10, otrzymasz 10 ostatnich wiadomości rejestrowane przez swój błąd.

Sprawdź poniżej linku: https://github.com/abdulwaheed18/Slf4jTutorial/blob/master/src/com/waheed/tutorial8/Application8.java https://github.com/abdulwaheed18/Slf4jTutorial/blob/master/sample8.xml

+0

Dzięki @Waheed (i +1 dla próbek kodu). Jedną z rzeczy, których wciąż nie dostaję jest: co się stanie, jeśli zwiększę moją wielkość bufora do 10, a następnie zarejestruję, powiedzmy, 12 komunikatów ERROR? Czy otrzymam 1 e-mail z 10 wiadomościami w dzienniku? Jeśli tak, co stanie się z ostatnimi 2 wiadomościami (10 + 2 = 12)? Dzięki jeszcze raz! –

+1

Tak, jeśli ustawisz wartość bufferSize na 10, otrzymasz tylko 10 ostatnich wiadomości. Przeważnie używamy SMTPAppender do powiadamiania administratora/OP, że coś poszło nie tak w twojej aplikacji. Tak więc, gdy tylko napotkany zostanie komunikat ERROR, wyśle ​​ci wiadomość z numerami ustawionych logów. Za każdy błąd ERROR otrzymasz jedną wiadomość. – Waheed

+0

Jeszcze raz dziękuję (i +1!) Przykro mi, ale nie próbuję być tutaj szkodnikiem, ale nadal nie rozumiem, co stanie się z ostatnimi 2 wiadomościami z dziennika. Powiedzmy, że mam kod, który uruchamia 12 komunikatów 'logger.error (" ... ")' z rzędu, a 'bufferSize' jest ustawiony na 10. Tak jak powiedziałeś, dostanę 1 wiadomość e-mail z 10 komunikatami ERROR. ** Ale co się dzieje z ostatnimi dziennikami błędów? ** Jeszcze raz dziękuję za wszelką pomoc! –

5

Wywołanie wychodzącej poczty e-mail jest obliczane przez "evaluator". Domyślnie SMTPAppender zawiera OnErrorEvaluator, który uruchamia wiadomości e-mail w przypadku zdarzeń o poziomie ERROR lub wyższym. W związku z tym domyślnie SMTPAppender wyśle ​​e-mail z drugim komunikatem (o poziomie ERROR), a nie pierwszym (WARN). Aby wyzwolić wiadomości wychodzące na WARN, napisz własnego ewaluatora. Oto kod:

public class OnWarnEvaluator extends EventEvaluatorBase<ILoggingEvent> { 

public boolean evaluate(ILoggingEvent event) throws NullPointerException, 
      EvaluationException { 
    return event.getLevel().levelInt >= Level.WARN_INT; 
} 
} 
+0

Czy to możliwe, aby opisać/skonfigurować takie oceniający lub sg. odpowiednik deklaratywnie w "log4j.xml" (dla Log4J 2.1)? Chciałbym otrzymać jedną wiadomość e-mail dla każdego z komunikatów dziennika INFO i ERROR. – Drux

1

Aby wywołać wychodzące wiadomości na ostrzec bez dodawania nowych plików źródłowych, można add the Janino dependency i jego oceniający:

<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"> 

    <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"> 
     <expression>return level >= WARN;</expression> 
    </evaluator> 
    ... 
</appender> 
Powiązane problemy