There is a difference between errors that occur when creating the Appender vs 
errors that occur in logging events. If an error occurs creating the Appender 
the rest of the configuration should be processed so that at least some logging 
works. If the error is too bad then the configuration will fail and the 
previous configuration will remain in affect.  

An error that occurs when logging is entirely different. In that case the 
Appender should throw an exception. It will be caught by the AppenderControl 
and only propagated to the application if the Appender is configured to have 
errors percolate. Otherwise it will be caught and ignored.

Ralph

> On May 4, 2017, at 6:01 AM, Mikael Ståldal <[email protected]> wrote:
> 
> AbstractOutputStreamAppender have this code:
> 
> public void append(final LogEvent event) {
>    try {
>        tryAppend(event);
>    } catch (final AppenderLoggingException ex) {
>        error("Unable to write to stream " + manager.getName() + " for
> appender " + getName() + ": " + ex);
>        throw ex;
>    }
> }
> 
> 
> Is that really the proper way of doing it? When I try this:
> 
> <Configuration status="WARN">
>    <Appenders>
>        <File name="File" fileName="/etc/test.log" createOnDemand="true">
>            <PatternLayout pattern="%date %5level %X %logger{15}: %message%n"/>
>        </File>
>    </Appenders>
>    <Loggers>
>        <Root level="INFO">
>            <AppenderRef ref="File"/>
>        </Root>
>    </Loggers>
> </Configuration>
> 
> I get two errors when it fails to create the file in /etc:
> 
> 2017-05-04 14:50:37,566 main ERROR Unable to write to stream /etc/test.log
> for appender File:
> org.apache.logging.log4j.core.appender.AppenderLoggingException: Error
> writing to stream /etc/test.log
> 2017-05-04 14:50:37,570 main ERROR An exception occurred processing
> Appender File
> org.apache.logging.log4j.core.appender.AppenderLoggingException: Error
> writing to stream /etc/test.log
> at
> org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDestination(OutputStreamManager.java:258)
> at
> org.apache.logging.log4j.core.appender.FileManager.writeToDestination(FileManager.java:177)
> at
> org.apache.logging.log4j.core.appender.OutputStreamManager.flushBuffer(OutputStreamManager.java:288)
> at
> org.apache.logging.log4j.core.appender.OutputStreamManager.flush(OutputStreamManager.java:297)
> at
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:179)
> at
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:170)
> at
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:161)
> at
> org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:448)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:433)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:403)
> at
> org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
> at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:146)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2091)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1988)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1960)
> at org.apache.logging.log4j.spi.AbstractLogger.info
> (AbstractLogger.java:1262)
> at logtest.Main.main(Main.java:29)
> Caused by: java.io.FileNotFoundException: /etc/test.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.FileManager.createOutputStream(FileManager.java:120)
> at
> org.apache.logging.log4j.core.appender.OutputStreamManager.getOutputStream(OutputStreamManager.java:166)
> at
> org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDestination(OutputStreamManager.java:256)
> ... 21 more
> 
> 
> (AbstractWriterAppender seems to have a similar problem.)
> 
> Wouldn't it be better with something like this:
> 
> public void append(final LogEvent event) {
>    try {
>        tryAppend(event);
>    } catch (final Exception ex) {
>        error("Unable to write to stream " + manager.getName() + " for
> appender " + getName(), event, ex);
>    }
> }
> 
> And then change the relevant Manager code to not catch exceptions.
> 
> -- 
> [image: MagineTV]
> 
> *Mikael Ståldal*
> Senior software developer
> 
> *Magine TV*
> [email protected]
> Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   www.magine.com
> 
> Privileged and/or Confidential Information may be contained in this
> message. If you are not the addressee indicated in this message
> (or responsible for delivery of the message to such a person), you may not
> copy or deliver this message to anyone. In such case,
> you should destroy this message and kindly notify the sender by reply
> email.


Reply via email to