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

Remko Popma edited comment on LOG4J2-1463 at 7/15/16 1:28 AM:
--------------------------------------------------------------

This issue has been fixed in LOG4J2-1324.

Since Log4j 2.6, Async loggers no longer use the LMAX FatalExceptionHandler, 
but instead use the custom 
{{org.apache.logging.log4j.core.async.AsyncLoggerDefaultExceptionHandler}} 
handler.

The Log4j exception handler will print details of the exception to System.err, 
but will _not_ rethrow the exception.  (See 
[source|https://github.com/apache/logging-log4j2/blob/master/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDefaultExceptionHandler.java]).

It is also possible to install a custom exception handler with system 
properties {{AsyncLogger.ExceptionHandler}} or 
{{AsyncLoggerConfig.ExceptionHandler}}.


was (Author: [email protected]):
This issue has been fixed in LOG4J2-1324.

Since Log4j 2.6, Async loggers no longer use the LMAX FatalExceptionHandler, 
but use 
{{org.apache.logging.log4j.core.async.AsyncLoggerDefaultExceptionHandler}} (see 
[source|https://github.com/apache/logging-log4j2/blob/master/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDefaultExceptionHandler.java]).

The Log4j exception handler will print details of the exception to System.err, 
but will _not_ rethrow the exception.

It is also possible to install a custom exception handler with system 
properties {[AsyncLogger.ExceptionHandler}} or 
{{AsyncLoggerConfig.ExceptionHandler}}.

> Disruptor stops after internal exception or error without diagnostic
> --------------------------------------------------------------------
>
>                 Key: LOG4J2-1463
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1463
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.5
>            Reporter: Dmitry Spikhalskiy
>             Fix For: 2.6
>
>
> Somewhere in my project, I have a creation of incorrect throwable (with 
> cyclic dependency or two much nesting maybe, have no idea about a root cause 
> for now).
> In stdout I have an exception, which is logged ny java.util logger:
> {noformat}
> Exception in thread "Log4j2-AsyncLogger[AsyncContext@13a5fe33]1" 
> java.lang.RuntimeException: java.lang.StackOverflowError
>   at 
> com.lmax.disruptor.FatalExceptionHandler.handleEventException(FatalExceptionHandler.java:45)
>   at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:148)
>   at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>   at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>   at java.lang.Thread.run(Thread.java:745)
> Caused by: java.lang.StackOverflowError
>   at java.util.Collections$SetFromMap.contains(Collections.java:5459)
>   at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:681)
> ...
> ...
> ...
>   at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:709)
>   at java.lang.Throwable.printStackTrace(Throwable.java:667)
>   at java.lang.Throwable.printStackTrace(Throwable.java:721)
>   at 
> org.apache.logging.log4j.core.pattern.ThrowablePatternConverter.formatOption(ThrowablePatternConverter.java:139)
>   at 
> org.apache.logging.log4j.core.pattern.ThrowablePatternConverter.format(ThrowablePatternConverter.java:81)
>   at 
> org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter.format(ExtendedThrowablePatternConverter.java:69)
>   at 
> org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:36)
>   at 
> org.apache.logging.log4j.core.layout.PatternLayout$PatternSerializer.toSerializable(PatternLayout.java:292)
>   at 
> org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:206)
>   at 
> org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:56)
>   at 
> org.apache.logging.log4j.core.layout.AbstractStringLayout.toByteArray(AbstractStringLayout.java:148)
>   at 
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:112)
>   at 
> org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.append(RollingRandomAccessFileAppender.java:98)
>   at 
> org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:152)
>   at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:125)
>   at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:116)
>   at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
>   at 
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:390)
>   at 
> org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:378)
>   at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:362)
>   at 
> org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:79)
>   at 
> org.apache.logging.log4j.core.async.AsyncLogger.actualAsyncLog(AsyncLogger.java:353)
>   at 
> org.apache.logging.log4j.core.async.RingBufferLogEvent.execute(RingBufferLogEvent.java:103)
>   at 
> org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:43)
>   at 
> org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:28)
>   at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:129)
>   ... 3 more
> {noformat}
> So, now Slf4j uses standard com.lmax.disruptor.FatalExceptionHandler, which:
> 1) use java.util.logging.Logger to log exception
> 2) rethrow exception and stop consumer thread / disruptor at all
> So, the whole app stopped after that because it's blocked on #warn() #error() 
> #info()/others invocation because of stopped disruptor inside Slf4J
> What should be good to have:
> Custom ExceptionHandler in Slf4J2, that
> 1) Would try to print some information about log parameters/exception that 
> caused the problem. At least we could try to print exception class, try to 
> print an exception message, try to fetch some first frames of the stacktrace. 
> Up to 10 for example. We can do this even if case of Error and even if we 
> decided th rethrow it and completely stop after this.
> 2) Will try to ignore such exception in terms of future invocations. So, 
> logging framework shouldn't just stop whole application because of internal 
> exception.



--
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