LOG4J2-1010, LOG4J2-1447, LOG4J2-1349 use ThreadContextMap for fine-grained context data injection
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/24cbcc6a Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/24cbcc6a Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/24cbcc6a Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext Commit: 24cbcc6a1d2bae5607f6db511f28a00968e7d4aa Parents: fcb58f1 Author: rpopma <[email protected]> Authored: Sun Aug 21 10:39:30 2016 +0900 Committer: rpopma <[email protected]> Committed: Tue Aug 23 00:31:15 2016 +0900 ---------------------------------------------------------------------- ...AbstractCopyOnWriteMutableThreadContext.java | 2 +- ...AbstractGarbageFreeMutableThreadContext.java | 2 +- .../core/impl/ContextDataInjectorFactory.java | 17 +++++---- .../core/impl/ThreadContextDataInjector.java | 37 ++++++++++---------- 4 files changed, 30 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/24cbcc6a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractCopyOnWriteMutableThreadContext.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractCopyOnWriteMutableThreadContext.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractCopyOnWriteMutableThreadContext.java index 9837ba8..ffc09ac 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractCopyOnWriteMutableThreadContext.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractCopyOnWriteMutableThreadContext.java @@ -129,7 +129,7 @@ public abstract class AbstractCopyOnWriteMutableThreadContext implements ThreadC return map == null ? Collections.<String, String>emptyMap() : map.asMap(); } - public ContextData getContextData() { + public MutableContextData getContextData() { return localMap.get(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/24cbcc6a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractGarbageFreeMutableThreadContext.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractGarbageFreeMutableThreadContext.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractGarbageFreeMutableThreadContext.java index 7a0e6f8..95dd30a 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractGarbageFreeMutableThreadContext.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractGarbageFreeMutableThreadContext.java @@ -131,7 +131,7 @@ public abstract class AbstractGarbageFreeMutableThreadContext implements ThreadC return map == null ? Collections.<String, String>emptyMap() : map.asMap(); } - public ContextData getContextData() { + public MutableContextData getContextData() { return localMap.get(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/24cbcc6a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java index d3da505..fa1c28f 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java @@ -17,7 +17,10 @@ package org.apache.logging.log4j.core.impl; import org.apache.logging.log4j.ThreadContext; +import org.apache.logging.log4j.ThreadContextAccess; import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.spi.AbstractCopyOnWriteMutableThreadContext; +import org.apache.logging.log4j.spi.AbstractGarbageFreeMutableThreadContext; import org.apache.logging.log4j.spi.ContextData; import org.apache.logging.log4j.spi.ThreadContextMap; import org.apache.logging.log4j.status.StatusLogger; @@ -69,13 +72,13 @@ public class ContextDataInjectorFactory { } private static ContextDataInjector createDefaultInjector() { -// final ThreadContextMap threadContextMap = null; // ThreadContext.getThreadContextMap(); TODO LOG4J2-1349 -// if (threadContextMap instanceof AbstractCopyOnWriteMutableThreadContext) { -// return new ThreadContextDataInjector.ForCopyOnWriteMutableThreadContextMap(); -// } -// if (threadContextMap instanceof AbstractGarbageFreeMutableThreadContext) { -// return new ThreadContextDataInjector.ForGarbageFreeMutableThreadContextMap(); -// } + final ThreadContextMap threadContextMap = ThreadContextAccess.getThreadContextMap(); + if (threadContextMap instanceof AbstractCopyOnWriteMutableThreadContext) { + return new ThreadContextDataInjector.ForCopyOnWriteMutableThreadContextMap(); + } + if (threadContextMap instanceof AbstractGarbageFreeMutableThreadContext) { + return new ThreadContextDataInjector.ForGarbageFreeMutableThreadContextMap(); + } return new ThreadContextDataInjector.ForDefaultThreadContextMap(); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/24cbcc6a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java index 786d23f..6c56520 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java @@ -20,10 +20,12 @@ import java.util.List; import java.util.Map; import org.apache.logging.log4j.ThreadContext; -import org.apache.logging.log4j.spi.ContextData; +import org.apache.logging.log4j.ThreadContextAccess; import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.spi.AbstractCopyOnWriteMutableThreadContext; +import org.apache.logging.log4j.spi.AbstractGarbageFreeMutableThreadContext; +import org.apache.logging.log4j.spi.ContextData; import org.apache.logging.log4j.spi.MutableContextData; -import org.apache.logging.log4j.spi.ThreadContextMap; /** * {@code ThreadContextDataInjector} contains a number of strategies for copying key-value pairs from the various @@ -105,10 +107,9 @@ public class ThreadContextDataInjector { // modified. copyProperties(props, reusable); - // TODO LOG4J2-1349 -// final MutableContextData immutableCopy = ((AbstractGarbageFreeMutableThreadContext) -// ThreadContext.getThreadContextMap()).getContextData(); -// reusable.putAll(immutableCopy); + final ContextData immutableCopy = ((AbstractGarbageFreeMutableThreadContext) + ThreadContextAccess.getThreadContextMap()).getContextData(); + reusable.putAll(immutableCopy); return reusable; } } @@ -133,19 +134,17 @@ public class ThreadContextDataInjector { */ @Override public MutableContextData injectContextData(final List<Property> props, final MutableContextData reusable) { - // TODO LOG4J2-1349 - -// // If there are no configuration properties we want to just return the ThreadContext's MutableContextData: -// // it is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy. -// final MutableContextData immutableCopy = ((AbstractCopyOnWriteMutableThreadContext) -// ThreadContext.getThreadContextMap()).getContextData(); -// if (props == null || props.isEmpty()) { -// return immutableCopy; -// } -// // However, if the list of Properties is non-empty we need to combine the properties and the ThreadContext -// // data. In that case we will copy the key-value pairs into the specified reusable MutableContextData. -// copyProperties(props, reusable); -// reusable.putAll(immutableCopy); + // If there are no configuration properties we want to just return the ThreadContext's MutableContextData: + // it is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy. + final MutableContextData immutableCopy = ((AbstractCopyOnWriteMutableThreadContext) + ThreadContextAccess.getThreadContextMap()).getContextData(); + if (props == null || props.isEmpty()) { + return immutableCopy; + } + // However, if the list of Properties is non-empty we need to combine the properties and the ThreadContext + // data. In that case we will copy the key-value pairs into the specified reusable MutableContextData. + copyProperties(props, reusable); + reusable.putAll(immutableCopy); return reusable; } }
