Details
Description
I found an issue when enabling asynchronous appenders with `-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector` and I also got a workaround to fix it.
Note that I invoke LogContext.setConfigLocation() then LogContext.reconfigure() in order to apply log4j2.xml programatically.
1. Stacktrace ... See the bottom of the Description as it is a large portion.
2. Workaround
Just to get rid of toString() at line 123 from the following snippet:
122 public void format(final LogEvent event, final StringBuilder output) { 123 output.append(levelMap == null ? event.getLevel().toString() : levelMap.get(event.getLevel())); 124 }
The workaround is as follows:
122 public void format(final LogEvent event, final StringBuilder output) { 123 output.append(levelMap == null ? event.getLevel() : levelMap.get(event.getLevel())); 124 }
3. Log4j2.xml
<RollingRandomAccessFile name="MySizeRollingLog" fileName="foo.log" filePattern="foo-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS z} %-5p [%t] (%F:%L) - [server($${sys:something})]-[%X{Something}]-%m%n" /> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> <SizeBasedTriggeringPolicy size="1000KB" /> </Policies> <DefaultRolloverStrategy max="3" /> </RollingRandomAccessFile>
I'm not sure why event.getLevel() was null but the workaround works for me.
Full stacktrace:
2013-12-05 09:36:58,947 ERROR An exception occurred processing Appender MySizeRollingLog java.lang.NullPointerException
at org.apache.logging.log4j.core.pattern.LevelPatternConverter.format(LevelPatternConverter.java:122)
at org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:36)
at org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:167)
at org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:52)
at org.apache.logging.log4j.core.layout.AbstractStringLayout.toByteArray(AbstractStringLayout.java:45)
at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:111)
at org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.append(RollingRandomAccessFileAppender.java:96)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:99)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:425)
at org.apache.logging.log4j.core.async.AsyncLoggerConfig.asyncCallAppenders(AsyncLoggerConfig.java:116)
at org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigHelper.java:218)
at org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigHelper.java:203)
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:695)
Attachments
Issue Links
- relates to
-
LOG4J2-2156 AbstractLogEvent should not implement getLevel()
- Open
-
LOG4J2-465 ThresholdFilter throws NPE
- Resolved