[
https://issues.apache.org/jira/browse/LOG4J2-927?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14254470#comment-14254470
]
Remko Popma commented on LOG4J2-927:
------------------------------------
A few questions:
# Are you making all loggers Asynchronous with the Log4jContextSelector system
property (and using {{Root}} and {{Logger}} in the configuration), or are you
specifying {{AsyncRoot}} and {{AsyncLogger}} in the log4j2.xml configuration?
# Is your application a web application?
# What version of the disruptor are you using?
In AsyncLogger.stop() there is a call to {{Disruptor.shutdown()}} (line 326).
Inside the disruptor, this busy-spins until all events currently in the
disruptor have been processed. Because the disruptor itself is taking care of
this there is no need for code in log4j to drain the disruptor.
Do you have a small application that you can attach to this Jira that
reproduces the issue? Without this it may be difficult to make progress on this
issue.
> Race condition between a LoggerContext stop() and async loggers
> ---------------------------------------------------------------
>
> Key: LOG4J2-927
> URL: https://issues.apache.org/jira/browse/LOG4J2-927
> Project: Log4j 2
> Issue Type: Bug
> Components: Appenders
> Affects Versions: 2.1
> Reporter: Mariano Gonzalez
>
> I have an application in which I'm using all async loggers. When I stop the
> LoggerContext, there're still some events waiting in disruptor's buffer and
> when it tries to execute them the context is already closed and thus those
> events are lost. In the case of a RollingFileAppender, I get an IOException
> because the outputStream has already been closed.
> As a debugging technique, I did an Appedder decorator that looks like this:
> {code:java}
> final class StopConditionSafeAppenderWrapper extends BaseAppenderWrapper
> {
> private final LoggerContext loggerContext;
> StopConditionSafeAppenderWrapper(Appender delegate, LoggerContext
> loggerContext)
> {
> super(delegate);
> this.loggerContext = loggerContext;
> }
> @Override
> public void append(LogEvent event)
> {
> if (!loggerContext.isStarted()) {
> return;
> }
> super.append(event);
> }
> }
> {code}
> With the help of a debugger, I could verify that when the append method was
> invoked the loggerContext was started but then by the time the exception
> occurred it was closed.
> It checked the code at LoggerContext#stop() and saw that there's code to
> prevent disruptor from taking new events once a stop() has been invoked, but
> there's no code to wait for the ring buffer to be fully consumed before
> actually stopping.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]