LOG4J2-493 AsyncLoggerContextSelector no longer has a singleton context, but manages multiple contexts (max one per classloader)
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/7e6c1b22 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/7e6c1b22 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7e6c1b22 Branch: refs/heads/LOG4J2-1161 Commit: 7e6c1b2270760798f4014e8ea5e1fa84843f26c9 Parents: 2a853aa Author: rpopma <rpo...@apache.org> Authored: Thu Oct 22 10:34:20 2015 +0900 Committer: rpopma <rpo...@apache.org> Committed: Thu Oct 22 10:34:20 2015 +0900 ---------------------------------------------------------------------- .../core/async/AsyncLoggerContextSelector.java | 24 ++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7e6c1b22/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java index 83e644c..d2ee058 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java @@ -18,8 +18,9 @@ package org.apache.logging.log4j.core.async; import java.net.URI; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.selector.ContextSelector; @@ -31,9 +32,7 @@ import org.apache.logging.log4j.util.PropertiesUtil; */ public class AsyncLoggerContextSelector implements ContextSelector { - // LOG4J2-666 ensure unique name across separate instances created by webapp classloaders - private static final AsyncLoggerContext CONTEXT = new AsyncLoggerContext("AsyncLoggerContext@" - + Integer.toHexString(AsyncLoggerContext.class.hashCode())); + private ConcurrentMap<String, AsyncLoggerContext> contexts = new ConcurrentHashMap<String, AsyncLoggerContext>(); /** * Returns {@code true} if the user specified this selector as the Log4jContextSelector, to make all loggers @@ -48,24 +47,31 @@ public class AsyncLoggerContextSelector implements ContextSelector { @Override public LoggerContext getContext(final String fqcn, final ClassLoader loader, final boolean currentContext) { - return CONTEXT; + // LOG4J2-666 ensure unique name across separate instances created by webapp classloaders + final int hash = loader == null ? getClass().getClassLoader().hashCode() : loader.hashCode(); + final String key = "AsyncLoggerContext@" + Integer.toHexString(hash); + AsyncLoggerContext result = contexts.get(key); + if (result == null) { + result = new AsyncLoggerContext(key); + return contexts.putIfAbsent(key, result); + } + return result; } @Override public List<LoggerContext> getLoggerContexts() { - final List<LoggerContext> list = new ArrayList<>(); - list.add(CONTEXT); - return Collections.unmodifiableList(list); + return new ArrayList<LoggerContext>(contexts.values()); } @Override public LoggerContext getContext(final String fqcn, final ClassLoader loader, final boolean currentContext, final URI configLocation) { - return CONTEXT; + return getContext(fqcn, loader, currentContext); } @Override public void removeContext(final LoggerContext context) { + contexts.remove(context.getName()); } }