diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java index 6d386fe139f..e61bfe57440 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java @@ -105,6 +105,19 @@ public interface ContextDataInjector { * the implementation of this method. It is not safe to pass the returned object to another thread. *
* @return a {@code ReadOnlyStringMap} object reflecting the current state of the context, may not return {@code null} + * @deprecated Since 2.24.0 use {@link #getValue} instead. */ + @Deprecated ReadOnlyStringMap rawContextData(); + + /** + * Retrieves a single context data value. + * + * @param key The context data key of the value to retrieve. + * @return A context data value. + * @since 2.24.0 + */ + default Object getValue(final String key) { + return rawContextData().getValue(key); + } } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java index 25187b0f171..3bd2cf14f45 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java @@ -36,7 +36,6 @@ import org.apache.logging.log4j.core.util.KeyValuePair; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.util.PerformanceSensitive; -import org.apache.logging.log4j.util.ReadOnlyStringMap; import org.apache.logging.log4j.util.StringMap; /** @@ -125,10 +124,9 @@ public boolean equals(final Object obj) { return true; } - private Result filter(final Level level, final ReadOnlyStringMap contextMap) { - final String value = contextMap.getValue(key); + private Result filter(final Level level, final Object value) { if (value != null) { - Level ctxLevel = levelMap.get(value); + Level ctxLevel = levelMap.get(Objects.toString(value, null)); if (ctxLevel == null) { ctxLevel = defaultThreshold; } @@ -139,35 +137,31 @@ private Result filter(final Level level, final ReadOnlyStringMap contextMap) { @Override public Result filter(final LogEvent event) { - return filter(event.getLevel(), event.getContextData()); + return filter(event.getLevel(), event.getContextData().getValue(key)); } @Override public Result filter( final Logger logger, final Level level, final Marker marker, final Message msg, final Throwable t) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override public Result filter( final Logger logger, final Level level, final Marker marker, final Object msg, final Throwable t) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override public Result filter( final Logger logger, final Level level, final Marker marker, final String msg, final Object... params) { - return filter(level, currentContextData()); - } - - private ReadOnlyStringMap currentContextData() { - return injector.rawContextData(); + return filter(level, injector.getValue(key)); } @Override public Result filter( final Logger logger, final Level level, final Marker marker, final String msg, final Object p0) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -178,7 +172,7 @@ public Result filter( final String msg, final Object p0, final Object p1) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -190,7 +184,7 @@ public Result filter( final Object p0, final Object p1, final Object p2) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -203,7 +197,7 @@ public Result filter( final Object p1, final Object p2, final Object p3) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -217,7 +211,7 @@ public Result filter( final Object p2, final Object p3, final Object p4) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -232,7 +226,7 @@ public Result filter( final Object p3, final Object p4, final Object p5) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -248,7 +242,7 @@ public Result filter( final Object p4, final Object p5, final Object p6) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -265,7 +259,7 @@ public Result filter( final Object p5, final Object p6, final Object p7) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -283,7 +277,7 @@ public Result filter( final Object p6, final Object p7, final Object p8) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } @Override @@ -302,7 +296,7 @@ public Result filter( final Object p7, final Object p8, final Object p9) { - return filter(level, currentContextData()); + return filter(level, injector.getValue(key)); } public String getKey() { diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java index 21e6e1da1ba..a224bd4e39a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java @@ -21,6 +21,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.core.ContextDataInjector; @@ -39,7 +40,6 @@ import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.util.IndexedReadOnlyStringMap; import org.apache.logging.log4j.util.PerformanceSensitive; -import org.apache.logging.log4j.util.ReadOnlyStringMap; import org.apache.logging.log4j.util.StringMap; /** @@ -109,26 +109,22 @@ public Result filter( private Result filter() { boolean match = false; if (useMap) { - ReadOnlyStringMap currentContextData = null; final IndexedReadOnlyStringMap map = getStringMap(); for (int i = 0; i < map.size(); i++) { - if (currentContextData == null) { - currentContextData = currentContextData(); - } - final String toMatch = currentContextData.getValue(map.getKeyAt(i)); - match = toMatch != null && ((List
* This injector always puts key-value pairs into the specified reusable StringMap.
*/
- public static class ForDefaultThreadContextMap implements ContextDataInjector {
-
- private final List
* This injector always puts key-value pairs into the specified reusable StringMap.
*/
- public static class ForGarbageFreeThreadContextMap implements ContextDataInjector {
- private final List
+ * This method avoids the overhead of copying the entire context data, when only a single value is needed.
+ *