Repository: logging-log4j2 Updated Branches: refs/heads/LOG4J2-89 8f8371e72 -> 224a9ec0a
LOG4J2-323/LOG4J2-493 bugfix: AbstractContext.stop() performed operations on the named LoggerConfigs but omitted some of these operations on the root LoggerConfig. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4320ef3a Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4320ef3a Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4320ef3a Branch: refs/heads/LOG4J2-89 Commit: 4320ef3ae7e77fab85e9db3509075a7362a544dc Parents: 6cd8112 Author: rpopma <[email protected]> Authored: Mon Nov 9 15:21:18 2015 +0900 Committer: Ralph Goers <[email protected]> Committed: Fri Nov 20 17:39:20 2015 -0700 ---------------------------------------------------------------------- .../core/config/AbstractConfiguration.java | 48 +++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4320ef3a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java index 58a21e5..13e45b6 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java @@ -275,13 +275,19 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement for (final LoggerConfig loggerConfig : loggerConfigs.values()) { loggerConfig.getReliabilityStrategy().beforeStopConfiguration(this); } + root.getReliabilityStrategy().beforeStopConfiguration(this); + final String cls = getClass().getSimpleName(); - LOGGER.trace("{} notified {} ReliabilityStrategies that config will be stopped.", cls, loggerConfigs.size()); + LOGGER.trace("{} notified {} ReliabilityStrategies that config will be stopped.", cls, loggerConfigs.size() + + 1); - LOGGER.trace("{} stopping {} LoggerConfigs.", cls, loggerConfigs.size()); - for (final LoggerConfig logger : loggerConfigs.values()) { - logger.stop(); + if (!loggerConfigs.isEmpty()) { + LOGGER.trace("{} stopping {} LoggerConfigs.", cls, loggerConfigs.size()); + for (final LoggerConfig logger : loggerConfigs.values()) { + logger.stop(); + } } + LOGGER.trace("{} stopping root LoggerConfig.", cls); if (!root.isStopped()) { root.stop(); } @@ -290,27 +296,24 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement LOGGER.trace("{} stopping AsyncLoggerConfigDisruptor.", cls); asyncLoggerConfigDisruptor.stop(); } - - LOGGER.trace("{} stopping AsyncAppenders.", cls); - + // Stop the appenders in reverse order in case they still have activity. final Appender[] array = appenders.values().toArray(new Appender[appenders.size()]); - - // LOG4J2-511, LOG4J2-392 stop AsyncAppenders first - int asyncAppenderCount = 0; - for (int i = array.length - 1; i >= 0; --i) { - if (array[i] instanceof AsyncAppender) { - array[i].stop(); - asyncAppenderCount++; + final List<Appender> async = getAsyncAppenders(array); + if (!async.isEmpty()) { + // LOG4J2-511, LOG4J2-392 stop AsyncAppenders first + LOGGER.trace("{} stopping {} AsyncAppenders.", cls, async.size()); + for (Appender appender : async) { + appender.stop(); } } - LOGGER.trace("{} stopped {} AsyncAppenders.", cls, asyncAppenderCount); LOGGER.trace("{} notifying ReliabilityStrategies that appenders will be stopped.", cls); for (final LoggerConfig loggerConfig : loggerConfigs.values()) { loggerConfig.getReliabilityStrategy().beforeStopAppenders(); } - + root.getReliabilityStrategy().beforeStopAppenders(); + LOGGER.trace("{} stopping remaining Appenders.", cls); int appenderCount = 0; for (int i = array.length - 1; i >= 0; --i) { @@ -321,7 +324,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement } LOGGER.trace("{} stopped {} remaining Appenders.", cls, appenderCount); - LOGGER.trace("{} cleaning Appenders from {} LoggerConfigs.", cls, loggerConfigs.size()); + LOGGER.trace("{} cleaning Appenders from {} LoggerConfigs.", cls, loggerConfigs.size() + 1); for (final LoggerConfig loggerConfig : loggerConfigs.values()) { // LOG4J2-520, LOG4J2-392: @@ -331,6 +334,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement // Only *after this* the appenders can be cleared or events will be lost. loggerConfig.clearAppenders(); } + root.clearAppenders(); if (watchManager.isStarted()) { watchManager.stop(); @@ -343,6 +347,16 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement } LOGGER.debug("Stopped {} OK", this); } + + private List<Appender> getAsyncAppenders(final Appender[] all) { + final List<Appender> result = new ArrayList<Appender>(); + for (int i = all.length - 1; i >= 0; --i) { + if (all[i] instanceof AsyncAppender) { + result.add(all[i]); + } + } + return result; + } @Override public boolean isShutdownHookEnabled() {
