Log4j2: SMTPAppender sendet keine E-Mails mit Fehlern oder schwerwiegenden Fehlern

Ich habe einige Probleme mit dem SMTPAppender in log4j2 erkannt. Immer wenn Ereignisse mit dem Level protokolliert werdenerror oderfatal erstellt werdenohne ein Ereignis mit dem Niveau habeninfo bevor keine E-Mail gesendet wird und das schwerwiegende Ereignis verschwindet.

Hier ist meine log4j2-Konfigurationsdatei (log4j2.xml) und ein kleines Programm (LogTest.java), um das Problem zu reproduzieren:

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

Ich habe dieses kleine Programm verwendet, um das Problem zu reproduzieren (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();
    }

}

Wenn Sie die beiden markierten Positionen auskommentieren, funktioniert alles wie vorgesehen: Es werden zwei E-Mails gesendet, die jeweils das fatale Ereignis und das Ereignis mit der vorherigen Information enthalten. Zusätzlich werden die 4 Ereignisse auf stdout gedruckt:

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

Wenn Sie jetzt nur die zweite Position aktivieren / deaktivieren, wird die zweite Mail (fatal2) wie beabsichtigt gesendet (erneut mit dem vorherigen info2-Ereignis), obwohl das erste fatale Ereignis gedruckt wird, um die Mail zu verschlingen. Die Ausgabe sieht wie folgt aus:

test fatal 1
test info 2
test fatal 2

Für mich persönlich scheint es, als hätte ich etwas falsches und falsch konfiguriertes log4j2 oder es könnte ein Fehler sein.

Danke im Vorraus für deine Hilfe.

* Jost

Hinweis:

Für die Tests habe ich verwendetlog4j2-beta7 von der Website des Projekts heruntergeladen. Die Dokumentation ist zu findenHier.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage