[
https://issues.apache.org/jira/browse/LOG4J2-669?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Remko Popma resolved LOG4J2-669.
--------------------------------
Resolution: Fixed
Fix Version/s: 2.0-rc2
Fixed in revision 1602578.
> NPE when combining AsyncLoggerConfig with AsyncLogger
> -----------------------------------------------------
>
> Key: LOG4J2-669
> URL: https://issues.apache.org/jira/browse/LOG4J2-669
> Project: Log4j 2
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.0-rc1
> Reporter: Remko Popma
> Assignee: Remko Popma
> Fix For: 2.0-rc2
>
>
> When all loggers are made asynchronous by setting Log4jContextSelector to
> {{org.apache.logging.log4j.core.async.AsyncLoggerContextSelector}}, they
> produce {{RingBufferLogEvent}} instances. These RingBufferLogEvents are
> mutable by design. They are used as follows:
> # Application calls logger.log("msg").
> # The AsyncLogger claims a RingBufferLogEvent and populates its fields
> (level, timestamp, message, etc).
> # The AsyncLogger then "publishes" the RingBufferLogEvent, to pass it to the
> event handler thread.
> # The event handler thread passes the RingBufferLogEvent to all appenders.
> # Finally, the event handler thread calls {{RingBufferLogEvent.clear()}} to
> allow the log message to be garbage collected (LOG4J2-304)
> This last step causes problems if the log event is still being processed.
> To reproduce this issue, configure all loggers to be asynchronous (with the
> Log4jContextSelector system property), and in the configuration, have a
> normal (non-async) Root logger, and an AsyncLogger.
> Be sure not to keep the default additivity="true", to ensure both the Root
> logger and the AsyncLogger process the events. (There may be other ways to
> reproduce this, but they all have to do with combining AsyncLogger with
> AsyncLoggerConfig.)
> This give the error below:
> {code}
> 2014-06-14 17:57:55,547 ERROR An exception occurred processing Appender File
> java.lang.NullPointerException
> at java.lang.StringBuilder.<init>(StringBuilder.java:92)
> at
> org.apache.logging.log4j.core.pattern.NameAbbreviator$PatternAbbreviator.abbreviate(NameAbbreviator.java:286)
> at
> org.apache.logging.log4j.core.pattern.NamePatternConverter.abbreviate(NamePatternConverter.java:53)
> at
> org.apache.logging.log4j.core.pattern.LoggerPatternConverter.format(LoggerPatternConverter.java:64)
> at
> org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:36)
> at
> org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:214)
> at
> org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:54)
> at
> org.apache.logging.log4j.core.layout.AbstractStringLayout.toByteArray(AbstractStringLayout.java:46)
> at
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:104)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:97)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:426)
> at
> org.apache.logging.log4j.core.async.AsyncLoggerConfig.asyncCallAppenders(AsyncLoggerConfig.java:118)
> at
> org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigHelper.java:222)
> at
> org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigHelper.java:207)
> at
> com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:133)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
> at java.lang.Thread.run(Thread.java:662)
> {code}
> By the time the {{AsyncLoggerConfigHelper$Log4jEventWrapperHandler}} handles
> the event, the original AsyncLogger has already called {{clear()}} on the
> event, so the logger name has been set to null, causing the NPE above.
--
This message was sent by Atlassian JIRA
(v6.2#6252)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]