Repository: logging-log4j2 Updated Branches: refs/heads/LOG4J2-1685 028ae4b45 -> 6123dc6fa
LOG4J2-1679 Add ThreadContextMap3 interface supporting method removeAll(Iterable<String>) Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/922e4829 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/922e4829 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/922e4829 Branch: refs/heads/LOG4J2-1685 Commit: 922e4829f28ca9279e4c8971d1c89d7ba71d40ca Parents: abf29af Author: Mikael Ståldal <[email protected]> Authored: Fri Nov 11 15:14:45 2016 +0100 Committer: Mikael Ståldal <[email protected]> Committed: Fri Nov 11 15:14:45 2016 +0100 ---------------------------------------------------------------------- .../org/apache/logging/log4j/ThreadContext.java | 20 ++++++++++ .../CopyOnWriteSortedArrayThreadContextMap.java | 13 +++++++ .../log4j/spi/DefaultThreadContextMap.java | 11 ++++++ .../GarbageFreeSortedArrayThreadContextMap.java | 10 +++++ .../log4j/spi/ObjectThreadContextMap.java | 4 +- .../logging/log4j/spi/ThreadContextMap2.java | 2 + .../logging/log4j/spi/ThreadContextMap3.java | 39 ++++++++++++++++++++ .../org/apache/logging/slf4j/MDCContextMap.java | 18 ++++++--- src/changes/changes.xml | 3 ++ 9 files changed, 113 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java index 5242993..4af2674 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java @@ -33,6 +33,7 @@ import org.apache.logging.log4j.spi.NoOpThreadContextMap; import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap; import org.apache.logging.log4j.spi.ThreadContextMap; import org.apache.logging.log4j.spi.ThreadContextMap2; +import org.apache.logging.log4j.spi.ThreadContextMap3; import org.apache.logging.log4j.spi.ThreadContextMapFactory; import org.apache.logging.log4j.spi.ThreadContextStack; import org.apache.logging.log4j.status.StatusLogger; @@ -289,6 +290,25 @@ public final class ThreadContext { } /** + * Removes the context values identified by the <code>keys</code> parameter. + * + * @param keys The keys to remove. + * + * @since 2.8 + */ + public static void removeAll(final Iterable<String> keys) { + if (contextMap instanceof ThreadContextMap3) { + ((ThreadContextMap3) contextMap).removeAll(keys); + } else if (contextMap instanceof DefaultThreadContextMap) { + ((DefaultThreadContextMap) contextMap).removeAll(keys); + } else { + for (final String key : keys) { + contextMap.remove(key); + } + } + } + + /** * Clears the context map. */ public static void clearMap() { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java index 3b91dbb..7b70e55 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java @@ -156,6 +156,19 @@ class CopyOnWriteSortedArrayThreadContextMap implements ReadOnlyThreadContextMap } @Override + public void removeAll(Iterable<String> keys) { + final StringMap map = localMap.get(); + if (map != null) { + final StringMap copy = createStringMap(map); + for (final String key : keys) { + copy.remove(key); + } + copy.freeze(); + localMap.set(copy); + } + } + + @Override public void clear() { localMap.remove(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java index 4a016be..fbf21d9 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java @@ -109,6 +109,17 @@ public class DefaultThreadContextMap implements ThreadContextMap, ReadOnlyString } } + public void removeAll(Iterable<String> keys) { + final Map<String, String> map = localMap.get(); + if (map != null) { + final Map<String, String> copy = new HashMap<>(map); + for (final String key : keys) { + copy.remove(key); + } + localMap.set(Collections.unmodifiableMap(copy)); + } + } + @Override public void clear() { localMap.remove(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java index 7113d9f..3eadb2c 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java @@ -150,6 +150,16 @@ class GarbageFreeSortedArrayThreadContextMap implements ReadOnlyThreadContextMap } @Override + public void removeAll(Iterable<String> keys) { + final StringMap map = localMap.get(); + if (map != null) { + for (final String key : keys) { + map.remove(key); + } + } + } + + @Override public void clear() { final StringMap map = localMap.get(); if (map != null) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java index a3e3715..31d6dd0 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java @@ -20,10 +20,10 @@ package org.apache.logging.log4j.spi; * Extension service provider interface to allow putting Object values in the * {@link org.apache.logging.log4j.ThreadContext}. * - * @see ThreadContextMap2 + * @see ThreadContextMap3 * @since 2.8 */ -public interface ObjectThreadContextMap extends ThreadContextMap2 { +public interface ObjectThreadContextMap extends ThreadContextMap3 { /** * Returns the Object value for the specified key, or {@code null} if the specified key does not exist in this http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java index 6c07b2e..e86f3c7 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java @@ -24,6 +24,8 @@ import org.apache.logging.log4j.util.StringMap; * Extension service provider interface to implement additional custom MDC behavior for * {@link org.apache.logging.log4j.ThreadContext}. * + * Consider implementing {@link ThreadContextMap3} instead. + * * @see ThreadContextMap * @since 2.7 */ http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap3.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap3.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap3.java new file mode 100644 index 0000000..46ac85a --- /dev/null +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap3.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache license, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license for the specific language governing permissions and + * limitations under the license. + */ +package org.apache.logging.log4j.spi; + +/** + * Extension service provider interface to implement additional custom MDC behavior for + * {@link org.apache.logging.log4j.ThreadContext}. + * + * @see ThreadContextMap + * @since 2.8 + */ +public interface ThreadContextMap3 extends ThreadContextMap2 { + + /** + * Removes all given context map keys from the current thread's context map. + * + * <p>If the current thread does not have a context map it is + * created as a side effect.</p> + + * @param keys The keys. + * @since 2.8 + */ + void removeAll(final Iterable<String> keys); + +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java ---------------------------------------------------------------------- diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java index f41fdb6..219323a 100644 --- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java +++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java @@ -19,15 +19,15 @@ package org.apache.logging.slf4j; import java.util.Map; import java.util.Map.Entry; -import org.apache.logging.log4j.util.StringMap; -import org.apache.logging.log4j.spi.ThreadContextMap2; +import org.apache.logging.log4j.spi.ThreadContextMap3; import org.apache.logging.log4j.util.SortedArrayStringMap; +import org.apache.logging.log4j.util.StringMap; import org.slf4j.MDC; /** * Bind the ThreadContextMap to the SLF4J MDC. */ -public class MDCContextMap implements ThreadContextMap2 { +public class MDCContextMap implements ThreadContextMap3 { private static final StringMap EMPTY_CONTEXT_DATA = new SortedArrayStringMap(1); static { @@ -41,9 +41,9 @@ public class MDCContextMap implements ThreadContextMap2 { @Override public void putAll(final Map<String, String> m) { - for (final Entry<String, String> entry : m.entrySet()) { + for (final Entry<String, String> entry : m.entrySet()) { MDC.put(entry.getKey(), entry.getValue()); - } + } } @Override @@ -56,6 +56,14 @@ public class MDCContextMap implements ThreadContextMap2 { MDC.remove(key); } + + @Override + public void removeAll(Iterable<String> keys) { + for (final String key : keys) { + MDC.remove(key); + } + } + @Override public void clear() { MDC.clear(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/922e4829/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index ec8d7f1..48c389d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -24,6 +24,9 @@ </properties> <body> <release version="2.8" date="2016-MM-DD" description="GA Release 2.8"> + <action issue="LOG4J2-1689" dev="mikes" type="fix"> + Add ThreadContextMap3 interface supporting method removeAll(Iterable<String>). + </action> <action issue="LOG4J2-1679" dev="rpopma" type="fix"> (GC) Avoid allocating temporary objects in StructuredDataFilter. </action>
