You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2015/10/22 19:50:27 UTC
[4/9] logging-log4j2 git commit: LOG4J2-493 factored out context
creation to separate method to facilitate subclassing, formatted code.
LOG4J2-493 factored out context creation to separate method to
facilitate subclassing, formatted code.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/7800b8f0
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/7800b8f0
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7800b8f0
Branch: refs/heads/LOG4J2-493-AsyncLogger-webapps
Commit: 7800b8f0416c6d9370de3eb7ab5da6e1ffdce36e
Parents: 25fe68d
Author: rpopma <rp...@apache.org>
Authored: Fri Oct 23 02:18:50 2015 +0900
Committer: rpopma <rp...@apache.org>
Committed: Fri Oct 23 02:18:50 2015 +0900
----------------------------------------------------------------------
.../selector/ClassLoaderContextSelector.java | 44 +++++++++++---------
1 file changed, 25 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7800b8f0/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
index f7fa5d4..6aa87b0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
@@ -33,11 +33,11 @@ import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.ReflectionUtil;
/**
- * This ContextSelector chooses a LoggerContext based upon the ClassLoader of the caller. This allows Loggers
- * assigned to static variables to be released along with the classes that own then. Other ContextSelectors
- * will generally cause Loggers associated with classes loaded from different ClassLoaders to be co-mingled.
- * This is a problem if, for example, a web application is undeployed as some of the Loggers being released may be
- * associated with a Class in a parent ClassLoader, which will generally have negative consequences.
+ * This ContextSelector chooses a LoggerContext based upon the ClassLoader of the caller. This allows Loggers assigned
+ * to static variables to be released along with the classes that own then. Other ContextSelectors will generally cause
+ * Loggers associated with classes loaded from different ClassLoaders to be co-mingled. This is a problem if, for
+ * example, a web application is undeployed as some of the Loggers being released may be associated with a Class in a
+ * parent ClassLoader, which will generally have negative consequences.
*
* The main downside to this ContextSelector is that Configuration is more challenging.
*
@@ -45,12 +45,12 @@ import org.apache.logging.log4j.util.ReflectionUtil;
*/
public class ClassLoaderContextSelector implements ContextSelector {
- private static final AtomicReference<LoggerContext> CONTEXT = new AtomicReference<>();
+ private static final AtomicReference<LoggerContext> DEFAULT_CONTEXT = new AtomicReference<>();
protected static final StatusLogger LOGGER = StatusLogger.getLogger();
protected static final ConcurrentMap<String, AtomicReference<WeakReference<LoggerContext>>> CONTEXT_MAP =
- new ConcurrentHashMap<>();
+ new ConcurrentHashMap<>();
@Override
public LoggerContext getContext(final String fqcn, final ClassLoader loader, final boolean currentContext) {
@@ -59,7 +59,7 @@ public class ClassLoaderContextSelector implements ContextSelector {
@Override
public LoggerContext getContext(final String fqcn, final ClassLoader loader, final boolean currentContext,
- final URI configLocation) {
+ final URI configLocation) {
if (currentContext) {
final LoggerContext ctx = ContextAnchor.THREAD_CONTEXT.get();
if (ctx != null) {
@@ -142,9 +142,8 @@ public class ClassLoaderContextSelector implements ContextSelector {
} */
}
}
- LoggerContext ctx = new LoggerContext(name, null, configLocation);
- final AtomicReference<WeakReference<LoggerContext>> r =
- new AtomicReference<>();
+ LoggerContext ctx = createContext(name, configLocation);
+ final AtomicReference<WeakReference<LoggerContext>> r = new AtomicReference<>();
r.set(new WeakReference<>(ctx));
CONTEXT_MAP.putIfAbsent(name, r);
ctx = CONTEXT_MAP.get(name).get().get();
@@ -156,29 +155,36 @@ public class ClassLoaderContextSelector implements ContextSelector {
if (ctx.getConfigLocation() == null && configLocation != null) {
LOGGER.debug("Setting configuration to {}", configLocation);
ctx.setConfigLocation(configLocation);
- } else if (ctx.getConfigLocation() != null && configLocation != null &&
- !ctx.getConfigLocation().equals(configLocation)) {
+ } else if (ctx.getConfigLocation() != null && configLocation != null
+ && !ctx.getConfigLocation().equals(configLocation)) {
LOGGER.warn("locateContext called with URI {}. Existing LoggerContext has URI {}", configLocation,
- ctx.getConfigLocation());
+ ctx.getConfigLocation());
}
return ctx;
}
- ctx = new LoggerContext(name, null, configLocation);
+ ctx = createContext(name, configLocation);
ref.compareAndSet(weakRef, new WeakReference<>(ctx));
return ctx;
}
- private String toContextMapKey(final ClassLoader loader) {
+ protected LoggerContext createContext(final String name, final URI configLocation) {
+ return new LoggerContext(name, null, configLocation);
+ }
+
+ protected String toContextMapKey(final ClassLoader loader) {
return Integer.toHexString(System.identityHashCode(loader));
}
protected LoggerContext getDefault() {
- final LoggerContext ctx = CONTEXT.get();
+ final LoggerContext ctx = DEFAULT_CONTEXT.get();
if (ctx != null) {
return ctx;
}
- CONTEXT.compareAndSet(null, new LoggerContext("Default"));
- return CONTEXT.get();
+ DEFAULT_CONTEXT.compareAndSet(null, createContext(defaultContextName(), null));
+ return DEFAULT_CONTEXT.get();
}
+ protected String defaultContextName() {
+ return "Default";
+ }
}