Description
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
Labels
Type
Projects
Status