[
https://issues.apache.org/jira/browse/LOG4J2-493?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13892821#comment-13892821
]
Remko Popma commented on LOG4J2-493:
------------------------------------
They are not related: LOG4J2-511 is about the underlying appender (e.g.
FileAppender) being stopped while the AsyncAppender still has log events in its
queue and the async thread is still passing these events to the FileAppender.
This issue (LOG4J2-493) has to do with deploy-undeploy-deploy-undeploy use
cases in web apps.
I did not consider this use case in enough depth when designing the Async
Loggers. The implementation for making all loggers async uses a static
initializer block to set up and start the Disruptor. (AsyncLogger line 116-)
This works fine if the class is unloaded when the web app is undeployed (when
the log4j-core jar is in WEB-INF/lib), but causes issues if the class is _not_
unloaded when the web app is undeployed (when the log4j-core jar is in the
application server's shared lib directory).
Note that mixing Async Loggers with synchronous Loggers does not have this
problem as the implementation is different. {{AsyncLoggerConfigHelper}} is
tracking the ref count and only shuts down the Disruptor if the ref count is
zero. It also allows for re-creating a new Disruptor if the ref count goes up
again.
Ideally we should do something similar in {{AsyncLogger}}. But until then, the
workaround is to put the log4j-core jar in WEB-INF/lib...
> NPE in AsyncLogger.shutdown
> ---------------------------
>
> Key: LOG4J2-493
> URL: https://issues.apache.org/jira/browse/LOG4J2-493
> Project: Log4j 2
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.0-beta9
> Environment: tomcat 7.0.42
> Reporter: Kireet Reddy
>
> When redeploying my application in tomcat multiple times, I get an exception:
> Exception in thread "Thread-29" java.lang.NullPointerException
> at
> org.apache.logging.log4j.core.async.AsyncLogger.stop(AsyncLogger.java:249)
> at
> org.apache.logging.log4j.core.async.AsyncLoggerContext.stop(AsyncLoggerContext.java:56)
> at
> org.apache.logging.log4j.core.LoggerContext$ShutdownThread.run(LoggerContext.java:437)
> This seems to be due to the fact that some initialization code happens in the
> class initializer but is undone in the stop() method which is called during
> webapp undeployment. This causes issues because in this case the log4j jar is
> loaded by the shared classloader ($catalina.home/lib) rather than the webapp
> classloader. This means the AsyncLogger class is not re-created during webapp
> deployment.
> I am using this structure because I have many 3rd party libraries and want to
> keep redeployments lightweight.
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]