2013-05-30 17 views
9

Ecco un frammento che contiene il mio Logback SMTPAppender:Perché Logback SMTPAppender invia solo 1 email?

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

Quando il seguente Java esegue:

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

ho solo 1 email. Impostando bufferSize su 1, mi sarei aspettato di ricevere 2 email diverse con 1 messaggio di registro singolo in ciascuna di esse. Cosa sta succedendo?

risposta

8

Come Ceki ha già menzionato che SMTPAPpender attiva le e-mail sugli eventi di livello ERRORE. Per avere tutti i registri in una mail, è possibile aumentare la buffersize

Qui aumentando bufferSize a 10, Si otterrà ultimi 10 messaggi registrati dal vostro errore.

controllare sotto il collegamento: https://github.com/abdulwaheed18/Slf4jTutorial/blob/master/src/com/waheed/tutorial8/Application8.java https://github.com/abdulwaheed18/Slf4jTutorial/blob/master/sample8.xml

+0

Grazie @Waheed (e +1 per gli esempi di codice). Una cosa che ancora non ottengo è: cosa succede se aumento il bufferSize a 10 e poi registro, ad esempio, 12 messaggi ERROR? Riceverò 1 email con 10 messaggi di log? Se sì, cosa succede agli ultimi 2 messaggi (10 + 2 = 12)? Grazie ancora! –

+1

Sì, se si imposta valore bufferSize su 10, verranno visualizzati solo gli ultimi 10 messaggi. Principalmente usiamo SMTPAppender per notificare all'amministratore/Ops che qualcosa è andato storto nella tua Applicazione. Quindi, non appena ha incontrato il registro ERROR, ti invierà una mail con i numeri di log che hai impostato. Per registro ERROR riceverai una mail. – Waheed

+0

Grazie ancora (e +1!) Mi dispiace, ma non sto cercando di essere una peste qui, ma non riesco ancora a capire cosa sarebbe successo agli ultimi 2 messaggi di registro. Diciamo che ho un codice che lancia 12 'loger.error (" ... ")' messaggi in una riga, e 'bufferSize' è impostato su 10. Come hai detto, avrei ricevuto 1 email con 10 messaggi di ERRORE. ** Ma cosa succede agli ultimi 2 registri di ERRORE? ** Grazie ancora per tutto il tuo aiuto finora! –

5

Il trigger dell'email in uscita è calcolato da "evaluator". Per impostazione predefinita, SMTPAppender viene fornito con OnErrorEvaluator che attiva le e-mail sugli eventi di livello ERROR o superiore. Pertanto, per impostazione predefinita, SMTPAppender invierà un'e-mail sul secondo messaggio (di livello ERRORE) e non sul primo (WARN). Per attivare i messaggi in uscita su WARN, scrivi il tuo valutatore. Ecco il codice:

public class OnWarnEvaluator extends EventEvaluatorBase<ILoggingEvent> { 

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

E 'possibile descrivere/configurare una tale valutatore o sg. equivalente dichiarativamente in 'log4j.xml' (per Log4J 2.1)? Vorrei ricevere una e-mail per ogni messaggio di errore INFO ed ERRORE. – Drux

1

per innescare i messaggi in uscita a mettere in guardia, senza l'aggiunta di nuovi file di origine, si potrebbe add the Janino dependency e il suo valutatore:

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