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