diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java index 7b6b0d8dc13..122b7af60b9 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java @@ -36,7 +36,6 @@ import org.apache.logging.log4j.core.util.Log4jThreadFactory; import org.apache.logging.log4j.core.util.Throwables; import org.apache.logging.log4j.message.Message; -import org.apache.logging.log4j.util.LoaderUtil; /** * Helper class for async loggers: AsyncLoggerDisruptor handles the mechanics of working with the LMAX Disruptor, and @@ -54,7 +53,11 @@ class AsyncLoggerDisruptor extends AbstractLifeCycle { private static EventHandler createEventHandler() { if (DisruptorUtil.DISRUPTOR_MAJOR_VERSION == 3) { try { - return LoaderUtil.newInstanceOf("org.apache.logging.log4j.core.async.RingBufferLogEventHandler"); + return (EventHandler) + // Avoid using `LoaderUtil`, which might choose an incorrect class loader – see #2768. + Class.forName("org.apache.logging.log4j.core.async.RingBufferLogEventHandler") + .getConstructor() + .newInstance(); } catch (final ReflectiveOperationException | LinkageError e) { LOGGER.warn("Failed to create event handler for LMAX Disruptor 3.x, trying version 4.x.", e); } diff --git a/src/changelog/.2.x.x/fix_disruptor3_cce.xml b/src/changelog/.2.x.x/fix_disruptor3_cce.xml new file mode 100644 index 00000000000..23d425a818f --- /dev/null +++ b/src/changelog/.2.x.x/fix_disruptor3_cce.xml @@ -0,0 +1,8 @@ + + + + Fix `ClassCastException` in LMAX Disruptor 3 initialization +