Details
Description
Using reconfigure() to select log files at runtime.
After the second reconfigure, the next log fails with a NullPointerException in org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper:253
It appears that the disruptor has been nulled and not been brought back up by the second reconfigure().
Trying to get a minimal test case I came up with the following log4j2.xml:
<?xml version="1.0" encoding="UTF-8" ?> <configuration status="debug"> <appenders> <Console name="console" target="SYSTEM_OUT"> <PatternLayout pattern="%d\{ABSOLUTE\} %6p %c %x - %m%n"/> </Console> </appenders> <loggers> <asyncroot level="WARN"> <appender-ref ref="console" /> </asyncroot> </loggers> </configuration>
The following Java class did NOT bring up the error, instead it threw a different exception (stack trace below):
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LoggerContext; public class Log4jAsyncReconfTest { private static final Logger log = LogManager.getLogger(Log4jAsyncReconfTest.class); public static void main(String[] args) throws InterruptedException { System.out.println("test"); LoggerContext ctx = (LoggerContext) LogManager.getContext(false); ctx.reconfigure(); ctx.reconfigure(); log.warn("Danger!"); } }
throws:
java.util.concurrent.RejectedExecutionException: Task com.lmax.disruptor.BatchEventProcessor@7ea4461e rejected from java.util.concurrent.ThreadPoolExecutor@52f79c86[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 1]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
at java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:628)
at com.lmax.disruptor.dsl.EventProcessorInfo.start(EventProcessorInfo.java:77)
at com.lmax.disruptor.dsl.Disruptor.start(Disruptor.java:263)
at org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper.initDisruptor(AsyncLoggerConfigHelper.java:119)