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());
     }
 
 }

Reply via email to