Skip to content

Failover Appender logic is not working properly #3622

Open
@sadmanmd

Description

@sadmanmd

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>

Metadata

Metadata

Assignees

No one assigned

    Labels

    appendersAffects one or more Appender pluginsbugIncorrect, unexpected, or unintended behavior of existing codewaiting-for-maintainer

    Type

    No type

    Projects

    Status

    Waiting for user

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions