I'm not sure if that LoaderUtil line will work properly everywhere. You already implicitly load the class by referencing the class's .class property I think. Either way, a more amusing and surefire way to make it load would be:
ExecutorServices.class.getClassLoader().loadClass(ExecutorServices.class.getName()); Or use one of the LoaderUtil/Loader methods that takes a ClassLoader argument to avoid an NPE if log4j is loaded as a bootstrap class somehow. ---------- Forwarded message ---------- From: <ggreg...@apache.org> Date: 6 December 2016 at 18:07 Subject: logging-log4j2 git commit: [LOG4J2-1642] To: comm...@logging.apache.org Repository: logging-log4j2 Updated Branches: refs/heads/master 2eb02c827 -> bdac7f223 [LOG4J2-1642] DefaultShutdownCallbackRegistry can throw a NoClassDefFoundError. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/ commit/bdac7f22 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/bdac7f22 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/bdac7f22 Branch: refs/heads/master Commit: bdac7f223b41dfbbf204ca924d08e6ed86c76769 Parents: 2eb02c8 Author: Johno Crawford <jo...@sulake.com> Authored: Tue Dec 6 16:07:52 2016 -0800 Committer: Gary Gregory <garydgreg...@gmail.com> Committed: Tue Dec 6 16:07:52 2016 -0800 ---------------------------------------------------------------------- .../apache/logging/log4j/core/LoggerContext.java | 16 +++++++++++++--- .../core/util/DefaultShutdownCallbackRegistry.java | 9 +++++++-- src/changes/changes.xml | 3 +++ 3 files changed, 23 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ bdac7f22/log4j-core/src/main/java/org/apache/logging/log4j/ core/LoggerContext.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java index 6902ade..4c4845e 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ LoggerContext.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ LoggerContext.java @@ -16,6 +16,8 @@ */ package org.apache.logging.log4j.core; +import static org.apache.logging.log4j.core.util.ShutdownCallbackRegistry. SHUTDOWN_HOOK_MARKER; + import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; @@ -52,10 +54,9 @@ import org.apache.logging.log4j.spi.AbstractLogger; import org.apache.logging.log4j.spi.LoggerContextFactory; import org.apache.logging.log4j.spi.LoggerRegistry; import org.apache.logging.log4j.spi.Terminable; +import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; -import static org.apache.logging.log4j.core.util.ShutdownCallbackRegistry. SHUTDOWN_HOOK_MARKER; - /** * The LoggerContext is the anchor for the logging system. It maintains a list of all the loggers requested by * applications and a reference to the Configuration. The Configuration will contain the configured loggers, appenders, @@ -63,7 +64,16 @@ import static org.apache.logging.log4j.core. util.ShutdownCallbackRegistry.SHUTDO */ public class LoggerContext extends AbstractLifeCycle implements org.apache.logging.log4j.spi.LoggerContext, AutoCloseable, Terminable, ConfigurationListener { - + + static { + try { + // LOG4J2-1642 preload ExecutorServices as it is used in shutdown hook + LoaderUtil.loadClass(ExecutorServices.class.getName()); + } catch (final Exception e) { + LOGGER.error("Failed to preload ExecutorServices class.", e); + } + } + /** * Property name of the property change event fired if the configuration is changed. */ http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ bdac7f22/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ DefaultShutdownCallbackRegistry.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ DefaultShutdownCallbackRegistry.java b/log4j-core/src/main/java/ org/apache/logging/log4j/core/util/DefaultShutdownCallbackRegistry.java index 48d54b6..d2be690 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ DefaultShutdownCallbackRegistry.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ DefaultShutdownCallbackRegistry.java @@ -72,8 +72,13 @@ public class DefaultShutdownCallbackRegistry implements ShutdownCallbackRegistry for (final Runnable hook : hooks) { try { hook.run(); - } catch (final Throwable t) { - LOGGER.error(SHUTDOWN_HOOK_MARKER, "Caught exception executing shutdown hook {}", hook, t); + } catch (final Throwable t1) { + try { + LOGGER.error(SHUTDOWN_HOOK_MARKER, "Caught exception executing shutdown hook {}", hook, t1); + } catch (final Throwable t2) { + System.err.println("Caught exception logging exception"); + t1.printStackTrace(); + } } } state.set(State.STOPPED); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ bdac7f22/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a6279b2..4fa7e54 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -147,6 +147,9 @@ <action issue="LOG4J2-1687" dev="ggregory" type="fix" due-to="Robert Christiansen"> NPE in ThrowableProxy when resolving stack in Java EE/OSGi environment. </action> + <action issue="LOG4J2-1642" dev="ggregory" type="fix" due-to="Johno Crawford"> + DefaultShutdownCallbackRegistry can throw a NoClassDefFoundError. + </action> <action issue="LOG4J2-1644" dev="ggregory" type="update" due-to="Tim Gokcen, Pavel Sivolobtchik"> Inefficient locking in AbstractLoggerAdapter. </action> -- Matt Sicker <boa...@gmail.com>