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 2016/11/08 14:16:34 UTC
logging-log4j2 git commit: LOG4J2-1678 Make ThreadContextMapFilter
garbage-free
Repository: logging-log4j2
Updated Branches:
refs/heads/master ee6d28c23 -> 0e4a8d6ad
LOG4J2-1678 Make ThreadContextMapFilter garbage-free
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/0e4a8d6a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/0e4a8d6a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/0e4a8d6a
Branch: refs/heads/master
Commit: 0e4a8d6ad433c74d52f72d5b10e91c04e7f70339
Parents: ee6d28c
Author: rpopma <rp...@apache.org>
Authored: Tue Nov 8 23:16:27 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Nov 8 23:16:27 2016 +0900
----------------------------------------------------------------------
.../logging/log4j/core/filter/MapFilter.java | 6 +-
.../core/filter/ThreadContextMapFilter.java | 79 +++++++++++++++++++-
log4j-core/src/test/resources/gcFreeLogging.xml | 4 +
.../resources/gcFreeMixedSyncAsyncLogging.xml | 4 +
src/changes/changes.xml | 3 +
5 files changed, 90 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0e4a8d6a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
index 7379aba..e760512 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
@@ -213,11 +213,11 @@ public class MapFilter extends AbstractFilter {
}
/**
- * Returns the StringMap with {@code List<String>} values that this MapFilter was constructed with.
- * @return the StringMap with {@code List<String>} values to match against
+ * Returns the SortedArrayStringMap with {@code List<String>} values that this MapFilter was constructed with.
+ * @return the SortedArrayStringMap with {@code List<String>} values to match against
* @since 2.8
*/
- protected StringMap getStringMap() {
+ protected SortedArrayStringMap getStringMap() {
return map;
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0e4a8d6a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java
----------------------------------------------------------------------
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 a5e5cf8..7c28f35 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
@@ -37,13 +37,16 @@ import org.apache.logging.log4j.core.ContextDataInjector;
import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory;
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.SortedArrayStringMap;
/**
* Filter based on a value in the Thread Context Map (MDC).
*/
@Plugin(name = "ThreadContextMapFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
@PluginAliases("ContextMapFilter")
+@PerformanceSensitive("allocation")
public class ThreadContextMapFilter extends MapFilter {
private final ContextDataInjector injector = ContextDataInjectorFactory.createInjector();
@@ -96,12 +99,13 @@ public class ThreadContextMapFilter extends MapFilter {
boolean match = false;
if (useMap) {
ReadOnlyStringMap currentContextData = null;
- for (final Map.Entry<String, List<String>> entry : getMap().entrySet()) {
+ final SortedArrayStringMap map = getStringMap();
+ for (int i = 0; i < map.size(); i++) {
if (currentContextData == null) {
currentContextData = currentContextData();
}
- final String toMatch = currentContextData.getValue(entry.getKey());
- match = toMatch != null && entry.getValue().contains(toMatch);
+ final String toMatch = currentContextData.getValue(map.getKeyAt(i));
+ match = toMatch != null && ((List<String>) map.getValueAt(i)).contains(toMatch);
if ((!isAnd() && match) || (isAnd() && !match)) {
break;
}
@@ -121,6 +125,75 @@ public class ThreadContextMapFilter extends MapFilter {
return super.filter(event.getContextData()) ? onMatch : onMismatch;
}
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1, final Object p2) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1, final Object p2, final Object p3) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1, final Object p2, final Object p3,
+ final Object p4) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1, final Object p2, final Object p3,
+ final Object p4, final Object p5) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1, final Object p2, final Object p3,
+ final Object p4, final Object p5, final Object p6) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1, final Object p2, final Object p3,
+ final Object p4, final Object p5, final Object p6,
+ final Object p7) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1, final Object p2, final Object p3,
+ final Object p4, final Object p5, final Object p6,
+ final Object p7, final Object p8) {
+ return filter();
+ }
+
+ @Override
+ public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+ final Object p0, final Object p1, final Object p2, final Object p3,
+ final Object p4, final Object p5, final Object p6,
+ final Object p7, final Object p8, final Object p9) {
+ return filter();
+ }
+
@PluginFactory
public static ThreadContextMapFilter createFilter(
@PluginElement("Pairs") final KeyValuePair[] pairs,
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0e4a8d6a/log4j-core/src/test/resources/gcFreeLogging.xml
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/resources/gcFreeLogging.xml b/log4j-core/src/test/resources/gcFreeLogging.xml
index ca9d4f3..1b38047 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -10,6 +10,10 @@
<KeyValuePair key="eventId" value="Logout"/>
</MapFilter>
<Marker marker="EVENT" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
+ <ContextMapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
+ <KeyValuePair key="User1" value="DEBUG"/>
+ <KeyValuePair key="User2" value="WARN"/>
+ </ContextMapFilter>
</Filters>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0e4a8d6a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
index 6ab59b6..73c7d4b 100644
--- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
@@ -10,6 +10,10 @@
<KeyValuePair key="eventId" value="Logout"/>
</MapFilter>
<Marker marker="EVENT" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
+ <ContextMapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
+ <KeyValuePair key="User1" value="DEBUG"/>
+ <KeyValuePair key="User2" value="WARN"/>
+ </ContextMapFilter>
</Filters>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0e4a8d6a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index d785f22..1f69bde 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-1678" dev="rpopma" type="fix">
+ (GC) Avoid allocating temporary objects in ThreadContextMapFilter.
+ </action>
<action issue="LOG4J2-1677" dev="rpopma" type="fix">
(GC) Avoid allocating temporary objects in MapFilter.
</action>