[ 
https://issues.apache.org/jira/browse/LOG4J2-1973?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17026627#comment-17026627
 ] 

Ronan Lanigan commented on LOG4J2-1973:
---------------------------------------

I've run into this same issue with 2.13.0. It would seem that the failover 
functionality is seriously flawed if it doesn't work in the scenario where the 
primary appender fails to start. This coupled with the fact that log4j doesn't 
fail if the log file is deleted by another process, makes it pretty useless.

> FailoverAppenders fail to start
> -------------------------------
>
>                 Key: LOG4J2-1973
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1973
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Appenders
>    Affects Versions: 2.8.2
>            Reporter: Vina Martin
>            Priority: Critical
>
> I created a simple Hello World program with Log4j2 2.8.2 following the 
> documentation.
> {code}
> import org.apache.logging.log4j.LogManager;
> import org.apache.logging.log4j.Logger;
> public class HelloWorld {
>     private static final Logger logger = 
> LogManager.getLogger(HelloWorld.class);
>     public static void main(final String... args) {
>         logger.error("A test error- hello world!");
>     }
> }
> {code}
> with the following configuration in {{log4j2.xml}}
> {code}
> <?xml version="1.0" encoding="UTF-8"?>
> <Configuration status="WARN">
>     <Appenders>
>         <Console name="Console" target="SYSTEM_OUT">
>             <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level 
> %logger{36} - %msg%n"/>
>         </Console>
>         <RollingFile name="RollingFile" fileName="logs/app.log" 
> filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"
>                      ignoreExceptions="false">
>             <PatternLayout>
>                 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
>             </PatternLayout>
>             <TimeBasedTriggeringPolicy />
>         </RollingFile>
>         <Failover name="Failover" primary="RollingFile">
>             <Failovers>
>                 <AppenderRef ref="Console"/>
>             </Failovers>
>         </Failover>
>     </Appenders>
>     <Loggers>
>         <Root level="error">
>             <AppenderRef ref="Failover"/>
>         </Root>
>     </Loggers>
> </Configuration>
> {code}
> I get this error when starting up my program: {{ERROR appender Failover has 
> no parameter that matches element Failovers}}. I observed that the hello 
> world message appeared in the log file and was properly appended each time I 
> ran my hello world program. 
> Then, I tried to simulate a scenario where a failover would happen to verify 
> that the failover appender is not starting properly. I locked the log file to 
> be read-only. After locking the file I ran the program and saw the following 
> output:
> {code}
> 2017-07-10 08:52:25,802 main ERROR RollingFileManager (logs/app.log) 
> java.io.FileNotFoundException: logs/app.log (Permission denied) 
> java.io.FileNotFoundException: logs/app.log (Permission denied)
>       at java.io.FileOutputStream.open0(Native Method)
>       at java.io.FileOutputStream.open(FileOutputStream.java:270)
>       at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
>       at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
>       at 
> org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:587)
>       at 
> org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:554)
>       at 
> org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:112)
>       at 
> org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:114)
>       at 
> org.apache.logging.log4j.core.appender.rolling.RollingFileManager.getFileManager(RollingFileManager.java:155)
>       at 
> org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:131)
>       at 
> org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:60)
>       at 
> org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:952)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:892)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:884)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:508)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:232)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:244)
>       at 
> org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:545)
>       at 
> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:617)
>       at 
> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:634)
>       at 
> org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:229)
>       at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152)
>       at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
>       at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
>       at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:551)
>       at HelloWorld.<clinit>(HelloWorld.java:10)
> 2017-07-10 08:52:25,810 main ERROR Unable to inject fields into builder class 
> for plugin type class 
> org.apache.logging.log4j.core.appender.RollingFileAppender, element 
> RollingFile. java.lang.IllegalStateException: ManagerFactory 
> [org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory@6c3708b3]
>  unable to create manager for [logs/app.log] with data 
> [org.apache.logging.log4j.core.appender.rolling.RollingFileManager$FactoryData@6f1fba17[pattern=logs/app-%d{MM-dd-yyyy}.log.gz,
>  append=true, bufferedIO=true, bufferSize=8192, 
> policy=TimeBasedTriggeringPolicy(nextRolloverMillis=0, interval=1, 
> modulate=false), strategy=DefaultRolloverStrategy(min=1, max=7, useMax=true), 
> advertiseURI=null, layout=%d %p %c{1.} [%t] %m%n]]
>       at 
> org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:114)
>       at 
> org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:114)
>       at 
> org.apache.logging.log4j.core.appender.rolling.RollingFileManager.getFileManager(RollingFileManager.java:155)
>       at 
> org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:131)
>       at 
> org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:60)
>       at 
> org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:952)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:892)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:884)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:508)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:232)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:244)
>       at 
> org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:545)
>       at 
> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:617)
>       at 
> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:634)
>       at 
> org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:229)
>       at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152)
>       at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
>       at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
>       at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:551)
>       at HelloWorld.<clinit>(HelloWorld.java:10)
> 2017-07-10 08:52:25,813 main ERROR Unable to invoke factory method in class 
> class org.apache.logging.log4j.core.appender.RollingFileAppender for element 
> RollingFile. java.lang.IllegalStateException: No factory method found for 
> class org.apache.logging.log4j.core.appender.RollingFileAppender
>       at 
> org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.findFactoryMethod(PluginBuilder.java:224)
>       at 
> org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:130)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:952)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:892)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:884)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:508)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:232)
>       at 
> org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:244)
>       at 
> org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:545)
>       at 
> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:617)
>       at 
> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:634)
>       at 
> org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:229)
>       at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152)
>       at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
>       at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
>       at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:551)
>       at HelloWorld.<clinit>(HelloWorld.java:10)
> 2017-07-10 08:52:25,815 main ERROR appender Failover has no parameter that 
> matches element Failovers
> 2017-07-10 08:52:25,816 main ERROR Null object returned for RollingFile in 
> Appenders.
> 2017-07-10 08:52:25,821 main ERROR Unable to locate primary Appender 
> RollingFile
> 2017-07-10 08:52:25,896 main ERROR Attempted to append to non-started 
> appender Failover
> 2017-07-10 08:52:25,897 main ERROR FailoverAppender Failover did not start 
> successfully
> {code}
> It appears to me that it was about to use the failover appender, however it 
> did not start properly due to the parsing error. 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to