2013-07-15 7 views
5

Ho riconosciuto alcuni problemi con SMTPAppender in log4j2. Ogni volta che si registrano eventi con il livello error o fatal vengono creati senza con un evento con il livello info prima che non venga inviata alcuna posta e l'evento fatale scompaia.Log4j2: SMTPAppender non invia messaggi con errore o livello irreversibile

Ecco il mio file di configurazione log4j2 (log4j2.xml) e un piccolo programma (LogTest.java) per riprodurre il problema:

<?xml version="1.0" encoding="UTF-8"?> 
    <configuration status="warn"> 

     <!-- mail server configuration --> 
     <properties> 
      <property name="receipients">[email protected]</property> 
      <property name="from">[email protected]</property> 
      <property name="smtpHost">smtp.example.com</property> 
      <property name="smtpPort">25</property> 
      <property name="smtpProtocol">smtp</property> 
      <property name="smtpUser">me</property> 
      <property name="smtpPassword">secret</property> 
     </properties> 

    <appenders> 

     <!-- appender to write all info events to stdout --> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <ThresholdFilter level="info" onMatch="NEUTRAL" onMismatch="DENY"/> 
     </Console> 

     <!-- appender to send mails (default: error and fatal events)--> 
     <SMTP name="Mailer" suppressExceptions="false" 
       subject="Error log" to="${receipients}" from="${from}" 
       smtpHost="${smtpHost}" smtpPort="${smtpPort}" 
       smtpProtocol="${smtpProtocol}" smtpUsername="${smtpUser}" 
       smtpPassword="${smtpPassword}" smtpDebug="false" bufferSize="2"> 
     </SMTP> 
     <!-- appender to send mails asynchronously --> 
     <Async name="AsyncMailer" > 
      <appender-ref ref="Mailer"/> 
     </Async> 

    </appenders> 
    <loggers> 

     <!-- logger to send mail on (at least) info level events --> 
     <logger name="LogTest" level="info" additivity="true"> 
      <appender-ref ref="AsyncMailer"/> 
     </logger> 

     <!-- root logger to see what happens (info level and "above") --> 
     <root level="info"> 
      <appender-ref ref="Console"/> 
     </root> 

    </loggers> 
</configuration> 

Ho usato questo piccolo programma per riprodurre il problema (LogTest .java):

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

class LogTest 
{ 
    private static Logger logger=LogManager.getLogger("LogTest"); 

    public void testlogger() 
    { 
     /* --> uncomment to enable first mail 
     logger.info("test info 1"); 
     */ 
     logger.fatal("test fatal 1"); 

     /* --> uncomment to enable second mail 
     logger.info("test info 2"); 
     */ 
     logger.fatal("test fatal 2"); 
    } 

    public static void main(String[] args) 
    { 
     LogTest app=new LogTest(); 
     app.testlogger(); 
    } 

} 

Se si rimuove il commento le due posizioni contrassegnate tutto funziona come previsto: due sono poste inviato - ciascuno contenente l'evento fatale e l'evento di informazione precedente. Inoltre i 4 eventi vengono stampati sullo standard output:

test info 1 
test fatal 1 
test info 2 
test fatal 2 

Ora, se la seconda posizione si attiva/decommentare solo - la seconda posta elettronica (fatal2) viene inviato come previsto (sempre con la prima manifestazione info2), ma anche se il primo evento fatale viene stampato per stdout la posta viene mangiata. L'output è il seguente:

test fatal 1 
test info 2 
test fatal 2 

Personalmente, per me sembra che ho qualcosa di sbagliato e log4j2 mis-configurati o potrebbe essere un bug.

Grazie per il vostro aiuto in anticipo.

* Jost

Nota:

Per le prove ho usato log4j2-beta7 scaricato dal sito web del progetto. La documentazione è disponibile here.

+0

UPDATE: Il problema è stato risolto ieri (08/28/2013) - la versione fissa è [2.0-beta9] (https://issues.apache.org/jira/browse/LOG4J2/fixforversion/12324756). – Jost

risposta

2

A prima vista sembra un insetto. Succede ancora se rimuovi il logger LogTest e configuri il tuo root logger in questo modo?

<root level="info"> 
    <appender-ref ref="Console"/> 
    <appender-ref ref="AsyncMailer"/> 
</root> 

Cordiali saluti, se poi avete bisogno di diversi livelli di registro sui diversi appenders è possibile ottenere che in questo modo (c'è bisogno di un registratore separato):

<root level="trace"> 
    <appender-ref ref="A" level="info" /> 
    <appender-ref ref="B" level="debug" /> 
</root> 
+0

In primo luogo, grazie per la rapida risposta. Sì, l'effetto è lo stesso quando rimuovo il logger LogTest, quindi sembra essere un bug (almeno in log4j2-beta7). La mia soluzione per il momento è semplicemente generare un evento informativo insieme a un evento fatale o di errore. – Jost

+0

Ho aperto un problema per questo nel [sito web del problema] del progetto (https://issues.apache.org/jira/browse/LOG4J2-310) (nel caso qualcuno volesse rintracciarlo). – Jost

+0

Grazie per aver creato il biglietto Jira. -Remko –