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>