logging-log4j2 icon indicating copy to clipboard operation
logging-log4j2 copied to clipboard

Failover Appender logic is not working properly

Open sadmanmd opened this issue 6 months ago • 3 comments

Description

While working on Log4j2 Failover appender, I saw the failovers appenders not executing properly. if you check the public start method of 'FailoverAppender' class, the logic says if the primary appender is null then it logs an error message and the error counter is increased by one. For that condition the super class 'start' method never executes and the FailoverAppender remains a non started appender. Because of this logic, for some reason primary Failover appender not initiated [like, file path not correct for RollingFile/File], the whole Failover appender will stop working and throw an non started appender error.

Configuration

Version: [Log4j version 2.17.0 - 2.24.3]

Operating system: [Windows/Mac/Linux]

JDK: [1.8,17]

Logs

Exception in thread "main" org.apache.logging.log4j.core.appender.AppenderLoggingException: Attempted to append to non-started appender MyFailoverAppender
	at org.apache.logging.log4j.core.config.AppenderControl.handleError(AppenderControl.java:147)
	at org.apache.logging.log4j.core.config.AppenderControl.ensureAppenderStarted(AppenderControl.java:140)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:132)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
	at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
	at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:683)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:641)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:624)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:560)
	at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
	at org.apache.logging.log4j.core.Logger.log(Logger.java:163)
	at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2168)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2122)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2105)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1980)
	at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1946)
	at org.apache.logging.log4j.spi.AbstractLogger.info(AbstractLogger.java:1283)

Reproduction

This config file could be use for reproduction, simply pul an invalid path at the primary appender it will not add to the base config.getAppenders list, because of this the primary appender become null and the FailoverAppender eventually never start for primary appender failure.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Appenders>
        <File name="PrimaryFileAppender" fileName="[USE AN INVALID PATH]/log/primary.log"
              ignoreExceptions="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>

        <Console name="BackupConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <RollingFile name="BackupRollingFileAppender"
                     append="true"
                     fileName="./log/backup.log"
                     filePattern="backup-%d{yyyy-MM-dd}-%i.log.gz"
                     ignoreExceptions="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <TimeBasedTriggeringPolicy interval="24" modulate="true"/>
            <SizeBasedTriggeringPolicy size="100 MB"/>
        </RollingFile>

        <Failover name="MyFailoverAppender" primary="PrimaryFileAppender" ignoreExceptions="false">
            <Failovers>
                <!-- THIS APPENDERS NEVER EXECUTE -->
                <AppenderRef ref="BackupConsoleAppender"/>
                <AppenderRef ref="BackupRollingFileAppender"/>
            </Failovers>
        </Failover>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="MyFailoverAppender"/>
        </Root>
    </Loggers>
</Configuration>

sadmanmd avatar Apr 17 '25 13:04 sadmanmd