[ 
https://issues.apache.org/jira/browse/LOG4J2-894?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sam Beroz updated LOG4J2-894:
-----------------------------
    Description: 
I'd like a way to create AsyncAppender and have it not throw if the appender it 
wraps is unavailable. My work around is to always also include an appender that 
I know to be available.

I've got a SyslogAppender that sends logs to a remote EC2 box and I've wrapped 
it in an AsyncAppender.  The log traffic's is just to monitor the state of the 
application and it's ok if it's not sent should the machine running it loose 
its internet connection or if Amazon goes down.

When I set the SyslogAppender's host to a fake URL I had expected it to fail 
gracefully but instead when I call LogManager.getLogger() the AsyncAppender 
threw a ConfigurationException reportingthat "No appenders are available for 
AsyncAppender", killing my whole application.

{code:title=org/apache/logging/log4j/core/appender/AsyncAppender.java|borderStyle=solid}
104            } else if (errorRef == null) {
105                throw new ConfigurationException("No appenders are available 
for AsyncAppender " + getName());
106            }
{code}

Looking at the source I thought I could avoid this by adding my  
ConsoleAppender as an errorRef but that results in a NullPointerException on 
startup because I still have zero appenders so start is called on the 
uninitialized thread:

{code:title=org/apache/logging/log4j/core/appender/AsyncAppender.java|borderStyle=solid}
101            if (appenders.size() > 0) {
102                thread = new AsyncThread(appenders, queue);
103                thread.setName("AsyncAppender-" + getName());
104            } else if (errorRef == null) {
105                throw new ConfigurationException("No appenders are available 
for AsyncAppender " + getName());
106            }
107    
108            thread.start();
{code}

I was able to work around this by also including my ConsoleAppender in the 
AsyncAppender so it always contains at least one valid appender:

{code:xml}
    <!-- The AsyncAppender will throw a Configuration Exception if it can't 
send data anywhere -->
    <Async name="Async" blocking="false" includeLocation="true">
      <AppenderRef ref="SYSLOG"/>
      <AppenderRef ref="CONSOLE"/>
    </Async>
{code}

Thanks - Sam


  was:
I'd like a way to create AsyncAppender and have it not throw if the appender it 
wraps is unavailable. My work around is to always also include an appender that 
I know to be available.

I've got a SyslogAppender that sends logs to a remote EC2 box and I've wrapped 
it in an AsyncAppender.  The log traffic's is just to monitor the state of the 
application and it's ok if it's not sent should the machine running it loose 
its internet connection or if Amazon goes down.

When I set the SyslogAppender's host to a fake URL I had expected it to fail 
gracefully but instead when I call LogManager.getLogger() the AsyncAppender 
threw a ConfigurationException reportingthat "No appenders are available for 
AsyncAppender", killing my whole application.

From: org/apache/logging/log4j/core/appender/AsyncAppender.java

104            } else if (errorRef == null) {
105                throw new ConfigurationException("No appenders are available 
for AsyncAppender " + getName());
106            }

Looking at the source I thought I could avoid this by adding my  
ConsoleAppender as an errorRef but that results in a NullPointerException on 
startup because I still have zero appenders so start is called on the 
uninitialized thread:

101            if (appenders.size() > 0) {
102                thread = new AsyncThread(appenders, queue);
103                thread.setName("AsyncAppender-" + getName());
104            } else if (errorRef == null) {
105                throw new ConfigurationException("No appenders are available 
for AsyncAppender " + getName());
106            }
107    
108            thread.start();

I was able to work around this by also including my ConsoleAppender in the 
AsyncAppender so it always contains at least one valid appender:

    <!-- The AsyncAppender will throw a Configuration Exception if it can't 
send data anywhere -->
    <Async name="Async" blocking="false" includeLocation="true">
      <AppenderRef ref="SYSLOG"/>
      <AppenderRef ref="CONSOLE"/>
    </Async>




> AsyncAppender throws ConfigurationException when wrapped SyslogAppender fails
> -----------------------------------------------------------------------------
>
>                 Key: LOG4J2-894
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-894
>             Project: Log4j 2
>          Issue Type: Bug
>    Affects Versions: 2.1
>         Environment: All
>            Reporter: Sam Beroz
>            Priority: Minor
>
> I'd like a way to create AsyncAppender and have it not throw if the appender 
> it wraps is unavailable. My work around is to always also include an appender 
> that I know to be available.
> I've got a SyslogAppender that sends logs to a remote EC2 box and I've 
> wrapped it in an AsyncAppender.  The log traffic's is just to monitor the 
> state of the application and it's ok if it's not sent should the machine 
> running it loose its internet connection or if Amazon goes down.
> When I set the SyslogAppender's host to a fake URL I had expected it to fail 
> gracefully but instead when I call LogManager.getLogger() the AsyncAppender 
> threw a ConfigurationException reportingthat "No appenders are available for 
> AsyncAppender", killing my whole application.
> {code:title=org/apache/logging/log4j/core/appender/AsyncAppender.java|borderStyle=solid}
> 104            } else if (errorRef == null) {
> 105                throw new ConfigurationException("No appenders are 
> available for AsyncAppender " + getName());
> 106            }
> {code}
> Looking at the source I thought I could avoid this by adding my  
> ConsoleAppender as an errorRef but that results in a NullPointerException on 
> startup because I still have zero appenders so start is called on the 
> uninitialized thread:
> {code:title=org/apache/logging/log4j/core/appender/AsyncAppender.java|borderStyle=solid}
> 101            if (appenders.size() > 0) {
> 102                thread = new AsyncThread(appenders, queue);
> 103                thread.setName("AsyncAppender-" + getName());
> 104            } else if (errorRef == null) {
> 105                throw new ConfigurationException("No appenders are 
> available for AsyncAppender " + getName());
> 106            }
> 107    
> 108            thread.start();
> {code}
> I was able to work around this by also including my ConsoleAppender in the 
> AsyncAppender so it always contains at least one valid appender:
> {code:xml}
>     <!-- The AsyncAppender will throw a Configuration Exception if it can't 
> send data anywhere -->
>     <Async name="Async" blocking="false" includeLocation="true">
>       <AppenderRef ref="SYSLOG"/>
>       <AppenderRef ref="CONSOLE"/>
>     </Async>
> {code}
> Thanks - Sam



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to