You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/11/08 10:15:51 UTC

[01/31] logging-log4j2 git commit: Better lvar name.

Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-1661 5fb3f0281 -> 07369539f


Better lvar name.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/b6ad0b23
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/b6ad0b23
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/b6ad0b23

Branch: refs/heads/LOG4J2-1661
Commit: b6ad0b233c0f3679835a5ce75522ce35668d819c
Parents: 4b12bb4
Author: Gary Gregory <gg...@apache.org>
Authored: Fri Nov 4 13:30:40 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Fri Nov 4 13:30:40 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/config/plugins/processor/PluginProcessor.java     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b6ad0b23/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
index b0e7570..13a83a6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
@@ -105,9 +105,9 @@ public class PluginProcessor extends AbstractProcessor {
     }
 
     private void writeCacheFile(final Element... elements) throws IOException {
-        final FileObject fo = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, Strings.EMPTY,
+        final FileObject fileObject = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, Strings.EMPTY,
                 PLUGIN_CACHE_FILE, elements);
-        try (final OutputStream out = fo.openOutputStream()) {
+        try (final OutputStream out = fileObject.openOutputStream()) {
             pluginCache.writeCache(out);
         }
     }


[09/31] logging-log4j2 git commit: LOG4J2-1663 include classpath in error report

Posted by mi...@apache.org.
LOG4J2-1663 include classpath in error report


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/7ec3d38e
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/7ec3d38e
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7ec3d38e

Branch: refs/heads/LOG4J2-1661
Commit: 7ec3d38e658c11c2a4b3715ca015ebe1893e7b7b
Parents: 4c0163c
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 00:18:18 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 00:18:18 2016 +0900

----------------------------------------------------------------------
 .../org/apache/logging/log4j/util/SortedArrayStringMapTest.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7ec3d38e/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index b2acf86..15afc6b 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -115,8 +115,8 @@ public class SortedArrayStringMapTest {
         if (exitValue != 0) {
             final StringBuilder sb = new StringBuilder();
             sb.append("DeserializerHelper exited with error code ").append(exitValue);
-            sb.append(". Classpath=").append(classpath);
-            sb.append(". Process output: ");
+            sb.append(". Classpath='").append(classpath);
+            sb.append("'. Process output: ");
             int c = -1;
             while ((c = in.read()) != -1) {
                 sb.append((char) c);


[25/31] logging-log4j2 git commit: format

Posted by mi...@apache.org.
format


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/243ff5b3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/243ff5b3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/243ff5b3

Branch: refs/heads/LOG4J2-1661
Commit: 243ff5b3e229c6be9452bb53f25549b17a21e7d0
Parents: bbd05cf
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 23:19:08 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 23:19:08 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/filter/DynamicThresholdFilter.java | 10 ----------
 1 file changed, 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/243ff5b3/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java
----------------------------------------------------------------------
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 b3a3498..86373a5 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
@@ -163,28 +163,24 @@ public final class DynamicThresholdFilter extends AbstractFilter {
     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
             final Object p0) {
         return filter(level, currentContextData());
-
     }
 
     @Override
     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
             final Object p0, final Object p1) {
         return filter(level, currentContextData());
-
     }
 
     @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(level, currentContextData());
-
     }
 
     @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(level, currentContextData());
-
     }
 
     @Override
@@ -192,7 +188,6 @@ public final class DynamicThresholdFilter extends AbstractFilter {
             final Object p0, final Object p1, final Object p2, final Object p3,
             final Object p4) {
         return filter(level, currentContextData());
-
     }
 
     @Override
@@ -200,7 +195,6 @@ public final class DynamicThresholdFilter extends AbstractFilter {
             final Object p0, final Object p1, final Object p2, final Object p3,
             final Object p4, final Object p5) {
         return filter(level, currentContextData());
-
     }
 
     @Override
@@ -208,7 +202,6 @@ public final class DynamicThresholdFilter extends AbstractFilter {
             final Object p0, final Object p1, final Object p2, final Object p3,
             final Object p4, final Object p5, final Object p6) {
         return filter(level, currentContextData());
-
     }
 
     @Override
@@ -217,7 +210,6 @@ public final class DynamicThresholdFilter extends AbstractFilter {
             final Object p4, final Object p5, final Object p6,
             final Object p7) {
         return filter(level, currentContextData());
-
     }
 
     @Override
@@ -226,7 +218,6 @@ public final class DynamicThresholdFilter extends AbstractFilter {
             final Object p4, final Object p5, final Object p6,
             final Object p7, final Object p8) {
         return filter(level, currentContextData());
-
     }
 
     @Override
@@ -235,7 +226,6 @@ public final class DynamicThresholdFilter extends AbstractFilter {
             final Object p4, final Object p5, final Object p6,
             final Object p7, final Object p8, final Object p9) {
         return filter(level, currentContextData());
-
     }
 
     public String getKey() {


[22/31] logging-log4j2 git commit: LOG4J2-1670 make EqualsReplacementConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1670 make EqualsReplacementConverter 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/69e7981c
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/69e7981c
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/69e7981c

Branch: refs/heads/LOG4J2-1661
Commit: 69e7981c5f4338e789fe306fce5b87bb17079657
Parents: c3a81c7
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 22:51:44 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 22:51:44 2016 +0900

----------------------------------------------------------------------
 .../pattern/EqualsReplacementConverter.java     | 50 ++++++++++++--------
 .../log4j/core/GcFreeLoggingTestUtil.java       |  8 ++--
 .../pattern/EqualsReplacementConverterTest.java |  5 +-
 log4j-core/src/test/resources/gcFreeLogging.xml |  2 +-
 .../resources/gcFreeMixedSyncAsyncLogging.xml   |  2 +-
 src/changes/changes.xml                         |  3 ++
 6 files changed, 42 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/69e7981c/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
index d4a2310..7b50d25 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
@@ -61,13 +61,10 @@ public final class EqualsReplacementConverter extends LogEventPatternConverter {
     }
 
     private final List<PatternFormatter> formatters;
-
+    private final List<PatternFormatter> substitutionFormatters;
     private final String substitution;
-
     private final String testString;
 
-    private final PatternParser parser;
-
     /**
      * Construct the converter.
      *
@@ -82,7 +79,9 @@ public final class EqualsReplacementConverter extends LogEventPatternConverter {
         this.testString = testString;
         this.substitution = substitution;
         this.formatters = formatters;
-        this.parser = parser;
+
+        // check if substitution needs to be parsed
+        substitutionFormatters = substitution.contains("%") ? parser.parse(substitution) : null;
     }
 
     /**
@@ -90,32 +89,43 @@ public final class EqualsReplacementConverter extends LogEventPatternConverter {
      */
     @Override
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        final StringBuilder buf = new StringBuilder();
-        for (final PatternFormatter formatter : formatters) {
-            formatter.format(event, buf);
+        final int initialSize = toAppendTo.length();
+        for (int i = 0; i < formatters.size(); i++) {
+            final PatternFormatter formatter = formatters.get(i);
+            formatter.format(event, toAppendTo);
+        }
+        if (equals(testString, toAppendTo, initialSize, toAppendTo.length() - initialSize)) {
+            toAppendTo.setLength(initialSize);
+            parseSubstitution(event, toAppendTo);
         }
-        final String string = buf.toString();
-        toAppendTo.append(testString.equals(string) ? parseSubstitution(event) : string);
+    }
+
+    private static boolean equals(String str, StringBuilder buff, int from, int len) {
+        if (str.length() == len) {
+            for (int i = 0; i < len; i++) {
+                if (str.charAt(i) != buff.charAt(i + from)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+        return false;
     }
 
     /**
-     * Returns the parsed substitution text.
+     * Adds the parsed substitution text to the specified buffer.
      *
      * @param event the current log event
-     * @return the parsed substitution text
+     * @param substitutionBuffer the StringBuilder to append the parsed substitution text to
      */
-    String parseSubstitution(final LogEvent event) {
-        final StringBuilder substitutionBuffer = new StringBuilder();
-        // check if substitution needs to be parsed
-        if (substitution.contains("%")) {
-            // parse substitution pattern
-            final List<PatternFormatter> substitutionFormatters = parser.parse(substitution);
-            for (final PatternFormatter formatter : substitutionFormatters) {
+    void parseSubstitution(final LogEvent event, final StringBuilder substitutionBuffer) {
+        if (substitutionFormatters != null) {
+            for (int i = 0; i < substitutionFormatters.size(); i++) {
+                final PatternFormatter formatter = substitutionFormatters.get(i);
                 formatter.format(event, substitutionBuffer);
             }
         } else {
             substitutionBuffer.append(substitution);
         }
-        return substitutionBuffer.toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/69e7981c/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
index 2136fc4..4604cd9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
@@ -55,11 +55,9 @@ public class GcFreeLoggingTestUtil {
         assertFalse("Constants.IS_WEB_APP", Constants.IS_WEB_APP);
 
         final MyCharSeq myCharSeq = new MyCharSeq();
-        final Marker test = MarkerManager.getMarker("test"); // initial creation, value is cached
-        final Marker testParent = MarkerManager.getMarker("testParent");
         final Marker testGrandParent = MarkerManager.getMarker("testGrandParent");
-        testParent.addParents(testGrandParent);
-        test.addParents(testParent);
+        final Marker testParent = MarkerManager.getMarker("testParent").setParents(testGrandParent);
+        final Marker test = MarkerManager.getMarker("test").setParents(testParent); // initial creation, value is cached
 
         // initialize LoggerContext etc.
         // This is not steady-state logging and will allocate objects.
@@ -68,7 +66,7 @@ public class GcFreeLoggingTestUtil {
 
         final org.apache.logging.log4j.Logger logger = LogManager.getLogger(testClass.getName());
         logger.debug("debug not set");
-        logger.fatal("This message is logged to the console");
+        logger.fatal(test, "This message is logged to the console");
         logger.error("Sample error message");
         logger.error("Test parameterized message {}", "param");
         for (int i = 0; i < 256; i++) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/69e7981c/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverterTest.java
index ec5106f..2b7984a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverterTest.java
@@ -102,7 +102,10 @@ public class EqualsReplacementConverterTest {
         final LoggerContext ctx = LoggerContext.getContext();
         final EqualsReplacementConverter converter = EqualsReplacementConverter.newInstance(ctx.getConfiguration(),
             new String[]{"[%marker]", "[]", substitution});
-        final String actual = converter.parseSubstitution(event);
+
+        final StringBuilder sb = new StringBuilder();
+        converter.parseSubstitution(event, sb);
+        final String actual = sb.toString();
         assertEquals(expected, actual);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/69e7981c/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 50476b0..c0598ce 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -6,7 +6,7 @@
     </Console>
     <File name="File" fileName="target/gcfreefile.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %equals{%markerSimpleName}{test}{substitute} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFile.log"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/69e7981c/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 92653ac..b6ce873 100644
--- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
@@ -6,7 +6,7 @@
     </Console>
     <File name="File" fileName="target/gcfreefileMixed.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %equals{%markerSimpleName}{test}{substitute} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFileMixed.log"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/69e7981c/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 85d095d..e38dba1 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-1670" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in EqualsReplacementConverter.
+      </action>
       <action issue="LOG4J2-1669" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in MaxLengthConverter.
       </action>


[17/31] logging-log4j2 git commit: LOG4J2-1666 make RelativeTimePatternConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1666 make RelativeTimePatternConverter 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/79acbcb6
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/79acbcb6
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/79acbcb6

Branch: refs/heads/LOG4J2-1661
Commit: 79acbcb658a8eb15e1e9c965d0432add39538e19
Parents: 84e16b8
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 16:15:42 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 16:15:42 2016 +0900

----------------------------------------------------------------------
 .../core/pattern/RelativeTimePatternConverter.java | 17 ++---------------
 log4j-core/src/test/resources/gcFreeLogging.xml    |  6 +++---
 .../test/resources/gcFreeMixedSyncAsyncLogging.xml |  6 +++---
 src/changes/changes.xml                            |  3 +++
 4 files changed, 11 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/79acbcb6/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
index 9767be1..98e3d5e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
@@ -27,12 +27,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
 @Plugin(name = "RelativeTimePatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "r", "relative" })
 public class RelativeTimePatternConverter extends LogEventPatternConverter {
-    /**
-     * Cached formatted timestamp.
-     */
-    private long lastTimestamp = Long.MIN_VALUE;
     private final long startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
-    private String relative;
 
     /**
      * Private constructor.
@@ -47,8 +42,7 @@ public class RelativeTimePatternConverter extends LogEventPatternConverter {
      * @param options options, currently ignored, may be null.
      * @return instance of RelativeTimePatternConverter.
      */
-    public static RelativeTimePatternConverter newInstance(
-        final String[] options) {
+    public static RelativeTimePatternConverter newInstance(final String[] options) {
         return new RelativeTimePatternConverter();
     }
 
@@ -58,13 +52,6 @@ public class RelativeTimePatternConverter extends LogEventPatternConverter {
     @Override
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
         final long timestamp = event.getTimeMillis();
-
-        synchronized (this) {
-            if (timestamp != lastTimestamp) {
-                lastTimestamp = timestamp;
-                relative = Long.toString(timestamp - startTime);
-            }
-        }
-        toAppendTo.append(relative);
+        toAppendTo.append(timestamp - startTime);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/79acbcb6/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 fd3d1a2..f91eb11 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefile.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFile.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAF.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/79acbcb6/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 7c29931..c5f77ec 100644
--- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefileMixed.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFileMixed.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAFMixed.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/79acbcb6/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 1925175..66c5c35 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-1666" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in RelativeTimePatternConverter.
+      </action>
       <action issue="LOG4J2-1665" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in IntegerPatternConverter.
       </action>


[13/31] logging-log4j2 git commit: LOG4J2-1663 undo URL encoding in classpath with spaces, with URLDecoder

Posted by mi...@apache.org.
LOG4J2-1663 undo URL encoding in classpath with spaces, with URLDecoder


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/bfab2459
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/bfab2459
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/bfab2459

Branch: refs/heads/LOG4J2-1661
Commit: bfab24593a9b552aec41385e7dfd2338244e0466
Parents: e2ffaa1
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 08:41:44 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 08:41:44 2016 +0900

----------------------------------------------------------------------
 .../apache/logging/log4j/util/SortedArrayStringMapTest.java  | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/bfab2459/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index 8ef2127..0dc4478 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -27,6 +27,8 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.lang.reflect.Field;
 import java.net.URL;
+import java.net.URLDecoder;
+import java.nio.charset.Charset;
 import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.Map;
@@ -125,7 +127,7 @@ public class SortedArrayStringMapTest {
         }
     }
 
-    private String createClassPath(Class<?>... classes) {
+    private String createClassPath(Class<?>... classes) throws Exception {
         final StringBuilder result = new StringBuilder();
         for (final Class<?> cls : classes) {
             if (result.length() > 0) {
@@ -136,7 +138,7 @@ public class SortedArrayStringMapTest {
         return result.toString();
     }
 
-    private String createClassPath(Class<?> cls) {
+    private String createClassPath(Class<?> cls) throws Exception {
         final String resource = "/" + cls.getName().replace('.', '/') + ".class";
         final URL url = cls.getResource(resource);
         String location = url.toString();
@@ -152,7 +154,7 @@ public class SortedArrayStringMapTest {
         if (!new File(location).exists()) {
             location = File.separator + location;
         }
-        location = location.replace("%20", " "); // undo URL encoding
+        location = URLDecoder.decode(location, Charset.defaultCharset().name()); // replace %20 with ' ' etc
         return location.isEmpty() ? "." : location;
     }
 


[08/31] logging-log4j2 git commit: LOG4J2-1663 include classpath in error report

Posted by mi...@apache.org.
LOG4J2-1663 include classpath in error report


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4c0163c8
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4c0163c8
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4c0163c8

Branch: refs/heads/LOG4J2-1661
Commit: 4c0163c81c561b2754cd497b747be7ee18a6666d
Parents: eddedb7
Author: rpopma <rp...@apache.org>
Authored: Sat Nov 5 23:51:21 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Nov 5 23:51:21 2016 +0900

----------------------------------------------------------------------
 .../org/apache/logging/log4j/util/SortedArrayStringMapTest.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4c0163c8/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index 03d4951..b2acf86 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -105,8 +105,8 @@ public class SortedArrayStringMapTest {
             fout.write(serialize(original));
             fout.flush();
         }
-        final Process process = new ProcessBuilder("java", "-cp",
-                createClassPath(SortedArrayStringMap.class, DeserializerHelper.class),
+        final String classpath = createClassPath(SortedArrayStringMap.class, DeserializerHelper.class);
+        final Process process = new ProcessBuilder("java", "-cp", classpath,
                 DeserializerHelper.class.getName(), file.getPath()).start();
         final BufferedReader in = new BufferedReader(new InputStreamReader(process.getErrorStream()));
         int exitValue = process.waitFor();
@@ -115,6 +115,7 @@ public class SortedArrayStringMapTest {
         if (exitValue != 0) {
             final StringBuilder sb = new StringBuilder();
             sb.append("DeserializerHelper exited with error code ").append(exitValue);
+            sb.append(". Classpath=").append(classpath);
             sb.append(". Process output: ");
             int c = -1;
             while ((c = in.read()) != -1) {


[28/31] logging-log4j2 git commit: LOG4J2-1674 make ThresholdFilter garbage-free

Posted by mi...@apache.org.
LOG4J2-1674 make ThresholdFilter 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/f958b326
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f958b326
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f958b326

Branch: refs/heads/LOG4J2-1661
Commit: f958b3269e6dc62dfe4b686c790d39621cd2362b
Parents: 0685745
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 23:31:48 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 23:31:48 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/filter/ThresholdFilter.java      | 69 ++++++++++++++++++++
 src/changes/changes.xml                         |  3 +
 2 files changed, 72 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f958b326/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
index 2fafd7c..e860c72 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
@@ -72,6 +72,75 @@ public final class ThresholdFilter extends AbstractFilter {
         return testLevel.isMoreSpecificThan(this.level) ? onMatch : onMismatch;
     }
 
+    @Override
+    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+            final Object p0) {
+        return filter(level);
+    }
+
+    @Override
+    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+            final Object p0, final Object p1) {
+        return filter(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
     public Level getLevel() {
         return level;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f958b326/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 55879bb..398893d 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-1674" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in ThresholdFilter.
+      </action>
       <action issue="LOG4J2-1673" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in MarkerFilter.
       </action>


[11/31] logging-log4j2 git commit: LOG4J2-1663 bugfix in creating classpath on linux

Posted by mi...@apache.org.
LOG4J2-1663 bugfix in creating classpath on linux


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6b525172
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6b525172
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6b525172

Branch: refs/heads/LOG4J2-1661
Commit: 6b52517251ff2794911741ede31516e7a54f3728
Parents: c35ac44
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 00:54:19 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 00:54:19 2016 +0900

----------------------------------------------------------------------
 .../org/apache/logging/log4j/util/SortedArrayStringMapTest.java   | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6b525172/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index 15afc6b..982af51 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -149,6 +149,9 @@ public class SortedArrayStringMapTest {
         if (location.endsWith(resource)) {
             location = location.substring(0, location.length() - resource.length());
         }
+        if (!new File(location).exists()) {
+            location = File.separator + location;
+        }
         return location.isEmpty() ? "." : location;
     }
 


[14/31] logging-log4j2 git commit: LOG4J2-1637 change log (underlying issue fixed by LOG4J2-1660)

Posted by mi...@apache.org.
LOG4J2-1637 change log (underlying issue fixed by LOG4J2-1660)


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/76961207
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/76961207
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/76961207

Branch: refs/heads/LOG4J2-1661
Commit: 769612070675edcf7e2d1fdd861d49b04ea7b8a0
Parents: bfab245
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 09:51:22 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 09:51:22 2016 +0900

----------------------------------------------------------------------
 src/changes/changes.xml | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76961207/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f86ae32..a204389 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-1637" dev="rpopma" type="fix">
+        Fixed problems when used in OSGi containers (IllegalAccessError, NoClassDefFoundError).
+      </action>
       <action issue="LOG4J2-1226" dev="rpopma" type="fix">
         Improve LogEvent serialization to handle non-serializable Messages and deserializing when required classes are missing.
       </action>


[05/31] logging-log4j2 git commit: LOG4J2-1663 Ensure SortedArrayStringMap can be serialized and deserialized without errors regardless of content

Posted by mi...@apache.org.
LOG4J2-1663 Ensure SortedArrayStringMap can be serialized and deserialized without errors regardless of content


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4df78d0a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4df78d0a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4df78d0a

Branch: refs/heads/LOG4J2-1661
Commit: 4df78d0ad5343593ff1a8b929d277d1f17f3f30f
Parents: dee36ee
Author: rpopma <rp...@apache.org>
Authored: Sat Nov 5 22:11:12 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Nov 5 22:11:12 2016 +0900

----------------------------------------------------------------------
 .../log4j/util/SortedArrayStringMap.java        | 23 ++++++-
 .../logging/log4j/util/DeserializerHelper.java  | 47 +++++++++++++
 .../log4j/util/SortedArrayStringMapTest.java    | 71 +++++++++++++++++++-
 src/changes/changes.xml                         |  3 +
 4 files changed, 140 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4df78d0a/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
index 07f8f0b..7b602b8 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
@@ -18,12 +18,15 @@ package org.apache.logging.log4j.util;
 
 import java.io.IOException;
 import java.io.InvalidObjectException;
+import java.rmi.MarshalledObject;
 import java.util.Arrays;
 import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
+import org.apache.logging.log4j.status.StatusLogger;
+
 /**
  * <em>Consider this class private.</em>
  * Array-based implementation of the {@code ReadOnlyStringMap} interface. Keys are held in a sorted array.
@@ -468,12 +471,16 @@ public class SortedArrayStringMap implements StringMap {
         if (size > 0) {
             for (int i = 0; i < size; i++) {
                 s.writeObject(keys[i]);
-                s.writeObject(values[i]);
+                try {
+                    s.writeObject(new MarshalledObject<>(values[i]));
+                } catch (final Exception e) {
+                    handleSerializationException(e, i, keys[i]);
+                    s.writeObject(null);
+                }
             }
         }
     }
 
-
     /**
      * Calculate the next power of 2, greater than or equal to x.
      * <p>
@@ -521,8 +528,18 @@ public class SortedArrayStringMap implements StringMap {
         // Read the keys and values, and put the mappings in the arrays
         for (int i = 0; i < mappings; i++) {
             keys[i] = (String) s.readObject();
-            values[i] = s.readObject();
+            try {
+                final MarshalledObject<Object> marshalledObject = (MarshalledObject<Object>) s.readObject();
+                values[i] = marshalledObject == null ? null : marshalledObject.get();
+            } catch (final Exception | LinkageError error) {
+                handleSerializationException(error, i, keys[i]);
+                values[i] = null;
+            }
         }
         size = mappings;
     }
+
+    private void handleSerializationException(final Throwable t, final int i, final String key) {
+        StatusLogger.getLogger().warn("Ignoring {} for key[{}] ('{}')", String.valueOf(t), i, keys[i]);
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4df78d0a/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
new file mode 100644
index 0000000..1fc8307
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
@@ -0,0 +1,47 @@
+/*
+ * 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.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.ObjectInputStream;
+
+/**
+ * Deserializes a specified file.
+ *
+ * @see SortedArrayStringMapTest#testDeserializationOfUnknownClass()
+ */
+public class DeserializerHelper {
+    public static void main(String... args) throws Exception {
+        final File file = new File(args[0]);
+        ObjectInputStream in = null;
+        try {
+            in = new ObjectInputStream(new FileInputStream(file));
+            final Object result = in.readObject();
+            System.out.println(result);
+        } catch (Throwable t) {
+            System.err.println("Could not deserialize: ");
+            t.printStackTrace();
+        } finally {
+            try {
+                in.close();
+            } catch (Throwable t) {
+                System.err.println("Error while closing: " + t);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4df78d0a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index f4f0710..58386d2 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -1,4 +1,4 @@
-package org.apache.logging.log4j.util;/*
+/*
  * 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.
@@ -14,13 +14,17 @@ package org.apache.logging.log4j.util;/*
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
+package org.apache.logging.log4j.util;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.lang.reflect.Field;
+import java.net.URL;
 import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.Map;
@@ -70,6 +74,71 @@ public class SortedArrayStringMapTest {
         assertEquals(original, copy);
     }
 
+    @Test
+    public void testSerializationOfNonSerializableValue() throws Exception {
+        final SortedArrayStringMap original = new SortedArrayStringMap();
+        original.putValue("a", "avalue");
+        original.putValue("B", "Bvalue");
+        original.putValue("unserializable", new Object());
+
+        final byte[] binary = serialize(original);
+        final SortedArrayStringMap copy = deserialize(binary);
+
+        final SortedArrayStringMap expected = new SortedArrayStringMap();
+        expected.putValue("a", "avalue");
+        expected.putValue("B", "Bvalue");
+        expected.putValue("unserializable", null);
+        assertEquals(expected, copy);
+    }
+
+    @Test
+    public void testDeserializationOfUnknownClass() throws Exception {
+        final SortedArrayStringMap original = new SortedArrayStringMap();
+        original.putValue("a", "avalue");
+        original.putValue("serializableButNotInClasspathOfDeserializer", new org.junit.runner.Result());
+        original.putValue("zz", "last");
+
+        final File file = new File("target/SortedArrayStringMap.ser");
+        try (FileOutputStream fout = new FileOutputStream(file, false)) {
+            fout.write(serialize(original));
+            fout.flush();
+        }
+        final Process process = new ProcessBuilder("java", "-cp",
+                createClassPath(SortedArrayStringMap.class, DeserializerHelper.class),
+                DeserializerHelper.class.getName(), file.getPath()).inheritIO().start();
+        int exitValue = process.waitFor();
+
+//        file.delete();
+        assertEquals("no error", 0, exitValue);
+    }
+
+    private String createClassPath(Class<?>... classes) {
+        final StringBuilder result = new StringBuilder();
+        for (final Class<?> cls : classes) {
+            if (result.length() > 0) {
+                result.append(File.pathSeparator);
+            }
+            result.append(createClassPath(cls));
+        }
+        return result.toString();
+    }
+
+    private String createClassPath(Class<?> cls) {
+        final String resource = "/" + cls.getName().replace('.', '/') + ".class";
+        final URL url = cls.getResource(resource);
+        String location = url.toString();
+        if (location.startsWith("jar:")) {
+            location = location.substring("jar:".length(), location.indexOf('!'));
+        }
+        if (location.startsWith("file:/")) {
+            location = location.substring("file:/".length());
+        }
+        if (location.endsWith(resource)) {
+            location = location.substring(0, location.length() - resource.length());
+        }
+        return location.isEmpty() ? "." : location;
+    }
+
     private byte[] serialize(final SortedArrayStringMap data) throws IOException {
         final ByteArrayOutputStream arr = new ByteArrayOutputStream();
         final ObjectOutputStream out = new ObjectOutputStream(arr);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4df78d0a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index d017257..f2b9fa5 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-1663" dev="rpopma" type="fix">
+        Ensure SortedArrayStringMap can be serialized and deserialized without errors regardless of content.
+      </action>
       <action issue="LOG4J2-1660" dev="rpopma" type="add">
         Added public method ThreadContext::getThreadContextMap; removed class ThreadContextAccess.
       </action>


[07/31] logging-log4j2 git commit: LOG4J2-1663 improve error reporting

Posted by mi...@apache.org.
LOG4J2-1663 improve error reporting


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/eddedb73
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/eddedb73
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/eddedb73

Branch: refs/heads/LOG4J2-1661
Commit: eddedb730e3f2449a1f77d70e2e732b8e6e60313
Parents: 8cd9f55
Author: rpopma <rp...@apache.org>
Authored: Sat Nov 5 23:35:00 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Nov 5 23:35:00 2016 +0900

----------------------------------------------------------------------
 .../log4j/util/SortedArrayStringMapTest.java        | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/eddedb73/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index 693bb5f..03d4951 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -16,11 +16,13 @@
  */
 package org.apache.logging.log4j.util;
 
+import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.lang.reflect.Field;
@@ -105,11 +107,21 @@ public class SortedArrayStringMapTest {
         }
         final Process process = new ProcessBuilder("java", "-cp",
                 createClassPath(SortedArrayStringMap.class, DeserializerHelper.class),
-                DeserializerHelper.class.getName(), file.getPath()).inheritIO().start();
+                DeserializerHelper.class.getName(), file.getPath()).start();
+        final BufferedReader in = new BufferedReader(new InputStreamReader(process.getErrorStream()));
         int exitValue = process.waitFor();
 
         file.delete();
-        assertEquals("no error", 0, exitValue);
+        if (exitValue != 0) {
+            final StringBuilder sb = new StringBuilder();
+            sb.append("DeserializerHelper exited with error code ").append(exitValue);
+            sb.append(". Process output: ");
+            int c = -1;
+            while ((c = in.read()) != -1) {
+                sb.append((char) c);
+            }
+            fail(sb.toString());
+        }
     }
 
     private String createClassPath(Class<?>... classes) {


[26/31] logging-log4j2 git commit: LOG4J2-1672 make LevelRangeFilter garbage-free

Posted by mi...@apache.org.
LOG4J2-1672 make LevelRangeFilter 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/f0a0245a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f0a0245a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f0a0245a

Branch: refs/heads/LOG4J2-1661
Commit: f0a0245a373f780a7a49a1dd2f0b3ac18af4a2c4
Parents: 243ff5b
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 23:22:00 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 23:22:00 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/filter/LevelRangeFilter.java     | 73 +++++++++++++++++++-
 src/changes/changes.xml                         |  3 +
 2 files changed, 74 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f0a0245a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
index fd78433..627b438 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
@@ -42,7 +42,7 @@ public final class LevelRangeFilter extends AbstractFilter {
 
     /**
      * Create a ThresholdFilter.
-     * 
+     *
      * @param minLevel
      *            The minimum log Level.
      * @param maxLevel
@@ -58,7 +58,7 @@ public final class LevelRangeFilter extends AbstractFilter {
             // @formatter:off
             @PluginAttribute("minLevel") final Level minLevel,
             @PluginAttribute("maxLevel") final Level maxLevel,
-            @PluginAttribute("onMatch") final Result match, 
+            @PluginAttribute("onMatch") final Result match,
             @PluginAttribute("onMismatch") final Result mismatch) {
             // @formatter:on
         final Level actualMinLevel = minLevel == null ? Level.ERROR : minLevel;
@@ -104,6 +104,75 @@ public final class LevelRangeFilter extends AbstractFilter {
         return filter(level);
     }
 
+    @Override
+    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+            final Object p0) {
+        return filter(level);
+    }
+
+    @Override
+    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+            final Object p0, final Object p1) {
+        return filter(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
+    @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(level);
+    }
+
     public Level getMinLevel() {
         return minLevel;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f0a0245a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e334cf9..fda05ad 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-1672" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in LevelRangeFilter.
+      </action>
       <action issue="LOG4J2-1671" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in EqualsIgnoreCaseReplacementConverter.
       </action>


[21/31] logging-log4j2 git commit: LOG4J2-1669 make MaxLengthConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1669 make MaxLengthConverter 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/c3a81c74
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/c3a81c74
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/c3a81c74

Branch: refs/heads/LOG4J2-1661
Commit: c3a81c74ba7b7264f25741efe27c7fad908b5c2d
Parents: 6d02679
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 22:11:37 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 22:11:37 2016 +0900

----------------------------------------------------------------------
 log4j-core/src/test/resources/gcFreeLogging.xml               | 6 +++---
 log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c3a81c74/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 a54b249..50476b0 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefile.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFile.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAF.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c3a81c74/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 8e09577..92653ac 100644
--- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefileMixed.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFileMixed.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAFMixed.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %markerSimpleName %maxLen{%marker}{10} %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"


[27/31] logging-log4j2 git commit: LOG4J2-1673 make MarkerFilter garbage-free

Posted by mi...@apache.org.
LOG4J2-1673 make MarkerFilter 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/0685745a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/0685745a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/0685745a

Branch: refs/heads/LOG4J2-1661
Commit: 0685745a9b4a103fb184c64b94982df85a4806eb
Parents: f0a0245
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 23:26:34 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 23:26:34 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/filter/MarkerFilter.java | 69 ++++++++++++++++++++
 src/changes/changes.xml                         |  3 +
 2 files changed, 72 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0685745a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
index f8d736f..c61c612 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
@@ -69,6 +69,75 @@ public final class MarkerFilter extends AbstractFilter {
     }
 
     @Override
+    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+            final Object p0) {
+        return filter(marker);
+    }
+
+    @Override
+    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
+            final Object p0, final Object p1) {
+        return filter(marker);
+    }
+
+    @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(marker);
+    }
+
+    @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(marker);
+    }
+
+    @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(marker);
+    }
+
+    @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(marker);
+    }
+
+    @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(marker);
+    }
+
+    @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(marker);
+    }
+
+    @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(marker);
+    }
+
+    @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(marker);
+    }
+
+    @Override
     public String toString() {
         return name;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0685745a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index fda05ad..55879bb 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-1673" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in MarkerFilter.
+      </action>
       <action issue="LOG4J2-1672" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in LevelRangeFilter.
       </action>


[31/31] logging-log4j2 git commit: Merge branch 'master' into LOG4J2-1661

Posted by mi...@apache.org.
Merge branch 'master' into LOG4J2-1661

# Conflicts:
#	src/changes/changes.xml


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/07369539
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/07369539
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/07369539

Branch: refs/heads/LOG4J2-1661
Commit: 07369539f47827504d4e7e42038d5595c9825458
Parents: 5fb3f02 62ddffd
Author: Mikael St�ldal <mi...@magine.com>
Authored: Tue Nov 8 11:15:19 2016 +0100
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Tue Nov 8 11:15:19 2016 +0100

----------------------------------------------------------------------
 .../org/apache/logging/log4j/MarkerManager.java | 13 ++-
 .../CopyOnWriteSortedArrayThreadContextMap.java | 14 ++-
 .../GarbageFreeSortedArrayThreadContextMap.java | 14 ++-
 .../log4j/spi/ObjectThreadContextMap.java       | 44 +++++++++
 .../log4j/util/SortedArrayStringMap.java        | 23 ++++-
 .../logging/log4j/util/DeserializerHelper.java  | 47 ++++++++++
 .../log4j/util/SortedArrayStringMapTest.java    | 90 +++++++++++++++++-
 log4j-core/pom.xml                              | 24 -----
 .../plugins/processor/PluginProcessor.java      |  4 +-
 .../log4j/core/filter/CompositeFilter.java      |  2 +
 .../core/filter/DynamicThresholdFilter.java     | 12 +--
 .../log4j/core/filter/LevelRangeFilter.java     | 75 ++++++++++++++-
 .../logging/log4j/core/filter/MarkerFilter.java | 71 ++++++++++++++
 .../log4j/core/filter/ThresholdFilter.java      | 71 ++++++++++++++
 .../logging/log4j/core/impl/Log4jLogEvent.java  | 43 +++++++--
 .../core/pattern/DatePatternConverter.java      |  2 +
 .../pattern/EqualsBaseReplacementConverter.java | 99 ++++++++++++++++++++
 .../EqualsIgnoreCaseReplacementConverter.java   | 51 ++++------
 .../pattern/EqualsReplacementConverter.java     | 59 +++---------
 .../core/pattern/FileDatePatternConverter.java  |  2 +
 .../log4j/core/pattern/FormattingInfo.java      |  3 +
 .../log4j/core/pattern/HighlightConverter.java  |  2 +
 .../core/pattern/IntegerPatternConverter.java   | 18 ++--
 .../core/pattern/LevelPatternConverter.java     |  2 +
 .../pattern/LineSeparatorPatternConverter.java  |  2 +
 .../core/pattern/LiteralPatternConverter.java   |  8 +-
 .../core/pattern/LoggerPatternConverter.java    |  2 +
 .../core/pattern/MarkerPatternConverter.java    |  7 +-
 .../MarkerSimpleNamePatternConverter.java       |  2 +
 .../log4j/core/pattern/MaxLengthConverter.java  | 19 ++--
 .../log4j/core/pattern/MdcPatternConverter.java |  2 +
 .../core/pattern/MessagePatternConverter.java   |  4 +-
 .../log4j/core/pattern/NameAbbreviator.java     |  3 +
 .../core/pattern/NamePatternConverter.java      |  3 +
 .../core/pattern/NanoTimePatternConverter.java  |  2 +
 .../pattern/RelativeTimePatternConverter.java   | 19 +---
 .../pattern/SequenceNumberPatternConverter.java |  7 +-
 .../log4j/core/pattern/StyleConverter.java      |  2 +
 .../core/pattern/ThreadIdPatternConverter.java  |  4 +-
 .../pattern/ThreadNamePatternConverter.java     |  2 +
 .../pattern/ThreadPriorityPatternConverter.java |  4 +-
 .../log4j/core/GcFreeLoggingTestUtil.java       |  7 +-
 .../log4j/core/impl/Log4jLogEventTest.java      |  4 +-
 .../pattern/EqualsReplacementConverterTest.java |  5 +-
 log4j-core/src/test/resources/gcFreeLogging.xml |  6 +-
 .../resources/gcFreeMixedSyncAsyncLogging.xml   |  6 +-
 pom.xml                                         | 36 ++++---
 src/changes/changes.xml                         | 39 ++++++++
 48 files changed, 781 insertions(+), 199 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/07369539/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/07369539/src/changes/changes.xml
----------------------------------------------------------------------
diff --cc src/changes/changes.xml
index 86cceb4,398893d..7d8d0dd
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@@ -24,9 -24,45 +24,48 @@@
    </properties>
    <body>
      <release version="2.8" date="2016-MM-DD" description="GA Release 2.8">
 +      <action issue="LOG4J2-1661" dev="mikes" type="add">
 +        Support Scala 2.12.
 +      </action>
+       <action issue="LOG4J2-1674" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in ThresholdFilter.
+       </action>
+       <action issue="LOG4J2-1673" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in MarkerFilter.
+       </action>
+       <action issue="LOG4J2-1672" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in LevelRangeFilter.
+       </action>
+       <action issue="LOG4J2-1671" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in EqualsIgnoreCaseReplacementConverter.
+       </action>
+       <action issue="LOG4J2-1670" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in EqualsReplacementConverter.
+       </action>
+       <action issue="LOG4J2-1669" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in MaxLengthConverter.
+       </action>
+       <action issue="LOG4J2-1668" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in MarkerPatternConverter.
+       </action>
+       <action issue="LOG4J2-1667" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in SequenceNumberPatternConverter.
+       </action>
+       <action issue="LOG4J2-1666" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in RelativeTimePatternConverter.
+       </action>
+       <action issue="LOG4J2-1665" dev="rpopma" type="fix">
+         (GC) Avoid allocating temporary objects in IntegerPatternConverter.
+       </action>
+       <action issue="LOG4J2-1637" dev="rpopma" type="fix">
+         Fixed problems when used in OSGi containers (IllegalAccessError, NoClassDefFoundError).
+       </action>
+       <action issue="LOG4J2-1226" dev="rpopma" type="fix">
+         Improve LogEvent serialization to handle non-serializable Messages and deserializing when required classes are missing.
+       </action>
+       <action issue="LOG4J2-1663" dev="rpopma" type="fix">
+         Ensure SortedArrayStringMap can be serialized and deserialized without errors regardless of content.
+       </action>
        <action issue="LOG4J2-1660" dev="rpopma" type="add">
          Added public method ThreadContext::getThreadContextMap; removed class ThreadContextAccess.
        </action>


[20/31] logging-log4j2 git commit: LOG4J2-1669 make MaxLengthConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1669 make MaxLengthConverter 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/6d026796
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6d026796
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6d026796

Branch: refs/heads/LOG4J2-1661
Commit: 6d0267967d45ba055c19b5ac3d03142d862e5a22
Parents: 78adf68
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 20:37:49 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 20:37:49 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/pattern/MaxLengthConverter.java     | 17 ++++++++---------
 log4j-core/src/test/resources/gcFreeLogging.xml    |  6 +++---
 .../test/resources/gcFreeMixedSyncAsyncLogging.xml |  6 +++---
 src/changes/changes.xml                            |  3 +++
 4 files changed, 17 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6d026796/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
index ca053f2..8fb9270 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
@@ -84,20 +84,19 @@ public final class MaxLengthConverter extends LogEventPatternConverter {
 
     @Override
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        final StringBuilder buf = new StringBuilder();
-        for (final PatternFormatter formatter : formatters) {
-            formatter.format(event, buf);
-            if (buf.length() > maxLength) {        // stop early
+        final int initialLength = toAppendTo.length();
+        for (int i = 0; i < formatters.size(); i++) {
+            final PatternFormatter formatter = formatters.get(i);
+            formatter.format(event, toAppendTo);
+            if (toAppendTo.length() > initialLength + maxLength) {        // stop early
                 break;
             }
         }
-        if (buf.length() > maxLength) {
-            buf.setLength(maxLength);
+        if (toAppendTo.length() > initialLength + maxLength) {
+            toAppendTo.setLength(initialLength + maxLength);
             if (maxLength > 20) {        // only append ellipses if length is not very short
-                buf.append("...");
+                toAppendTo.append("...");
             }
         }
-        toAppendTo.append(buf);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6d026796/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 41101eb..a54b249 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefile.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFile.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAF.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6d026796/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 62a7885..8e09577 100644
--- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefileMixed.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFileMixed.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAFMixed.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %maxLen{%markerSimpleName}{10} %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6d026796/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 72be3fa..85d095d 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-1669" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in MaxLengthConverter.
+      </action>
       <action issue="LOG4J2-1668" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in MarkerPatternConverter.
       </action>


[04/31] logging-log4j2 git commit: Move annotation processing configuration to the parent POM.

Posted by mi...@apache.org.
Move annotation processing configuration to the parent POM.

This allows the compiler args configuration to be used for all child
POMS. This commit does not include compiler args for annotation
processing but I have experiments that do for experimenting with
generating different kinds of plugin cache files for all modules.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/dee36ee5
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/dee36ee5
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/dee36ee5

Branch: refs/heads/LOG4J2-1661
Commit: dee36ee53fae3270e015785956ddbbcbe9ea083c
Parents: db38f18
Author: Gary Gregory <gg...@apache.org>
Authored: Fri Nov 4 16:24:00 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Fri Nov 4 16:24:00 2016 -0700

----------------------------------------------------------------------
 log4j-core/pom.xml | 24 ------------------------
 pom.xml            | 24 ++++++++++++++++++++++++
 2 files changed, 24 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/dee36ee5/log4j-core/pom.xml
----------------------------------------------------------------------
diff --git a/log4j-core/pom.xml b/log4j-core/pom.xml
index 5cda105..5228a8d 100644
--- a/log4j-core/pom.xml
+++ b/log4j-core/pom.xml
@@ -333,30 +333,6 @@
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>${compiler.plugin.version}</version>
-        <executions>
-          <execution>
-            <!-- disable annotation processing for first pass -->
-            <id>default-compile</id>
-            <goals>
-              <goal>compile</goal>
-            </goals>
-            <phase>compile</phase>
-            <configuration>
-              <proc>none</proc>
-            </configuration>
-          </execution>
-          <execution>
-            <!-- then do a processing-only pass to generate plugins .dat file -->
-            <id>process-plugins</id>
-            <goals>
-              <goal>compile</goal>
-            </goals>
-            <phase>process-classes</phase>
-            <configuration>
-              <proc>only</proc>
-            </configuration>
-          </execution>
-        </executions>
       </plugin>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/dee36ee5/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 242c4fc..fd71440 100644
--- a/pom.xml
+++ b/pom.xml
@@ -868,6 +868,30 @@
               <Xlint />
             </compilerArguments>
           </configuration>
+          <executions>
+            <execution>
+              <!-- disable annotation processing for first pass -->
+              <id>default-compile</id>
+              <goals>
+                <goal>compile</goal>
+              </goals>
+              <phase>compile</phase>
+              <configuration>
+                <proc>none</proc>
+              </configuration>
+            </execution>
+            <execution>
+              <!-- then do a processing-only pass to generate plugins .dat file -->
+              <id>process-plugins</id>
+              <goals>
+                <goal>compile</goal>
+              </goals>
+              <phase>process-classes</phase>
+              <configuration>
+                <proc>only</proc>
+              </configuration>
+            </execution>
+          </executions>          
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>


[12/31] logging-log4j2 git commit: LOG4J2-1663 undo URL encoding in classpath with spaces

Posted by mi...@apache.org.
LOG4J2-1663 undo URL encoding in classpath with spaces


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/e2ffaa13
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/e2ffaa13
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/e2ffaa13

Branch: refs/heads/LOG4J2-1661
Commit: e2ffaa13c7477e5a6381c22ec79ca366a7f98697
Parents: 6b52517
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 08:34:02 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 08:34:02 2016 +0900

----------------------------------------------------------------------
 .../org/apache/logging/log4j/util/SortedArrayStringMapTest.java     | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e2ffaa13/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index 982af51..8ef2127 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -152,6 +152,7 @@ public class SortedArrayStringMapTest {
         if (!new File(location).exists()) {
             location = File.separator + location;
         }
+        location = location.replace("%20", " "); // undo URL encoding
         return location.isEmpty() ? "." : location;
     }
 


[24/31] logging-log4j2 git commit: LOG4J2-1671 make EqualsIgnoreCaseReplacementConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1671 make EqualsIgnoreCaseReplacementConverter 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/bbd05cfa
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/bbd05cfa
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/bbd05cfa

Branch: refs/heads/LOG4J2-1661
Commit: bbd05cfab193087687b91a912585c183edd4f741
Parents: 9ca3576
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 23:09:34 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 23:09:34 2016 +0900

----------------------------------------------------------------------
 src/changes/changes.xml | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/bbd05cfa/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e38dba1..e334cf9 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-1671" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in EqualsIgnoreCaseReplacementConverter.
+      </action>
       <action issue="LOG4J2-1670" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in EqualsReplacementConverter.
       </action>


[29/31] logging-log4j2 git commit: LOG4J2-1341 mark garbage-free converters with the @PerformanceSensitive("allocation") annotation

Posted by mi...@apache.org.
LOG4J2-1341 mark garbage-free converters with the @PerformanceSensitive("allocation") annotation


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/76d78fe9
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/76d78fe9
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/76d78fe9

Branch: refs/heads/LOG4J2-1661
Commit: 76d78fe9a4adecebd9805d051a1606b2ac70ccd0
Parents: f958b32
Author: rpopma <rp...@apache.org>
Authored: Mon Nov 7 07:43:16 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Mon Nov 7 07:43:16 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/pattern/DatePatternConverter.java     | 2 ++
 .../log4j/core/pattern/EqualsBaseReplacementConverter.java   | 2 ++
 .../core/pattern/EqualsIgnoreCaseReplacementConverter.java   | 2 ++
 .../log4j/core/pattern/EqualsReplacementConverter.java       | 2 ++
 .../logging/log4j/core/pattern/FileDatePatternConverter.java | 2 ++
 .../apache/logging/log4j/core/pattern/FormattingInfo.java    | 3 +++
 .../logging/log4j/core/pattern/HighlightConverter.java       | 2 ++
 .../logging/log4j/core/pattern/IntegerPatternConverter.java  | 2 ++
 .../logging/log4j/core/pattern/LevelPatternConverter.java    | 2 ++
 .../log4j/core/pattern/LineSeparatorPatternConverter.java    | 2 ++
 .../logging/log4j/core/pattern/LiteralPatternConverter.java  | 8 +++++---
 .../logging/log4j/core/pattern/LoggerPatternConverter.java   | 2 ++
 .../logging/log4j/core/pattern/MarkerPatternConverter.java   | 2 ++
 .../log4j/core/pattern/MarkerSimpleNamePatternConverter.java | 2 ++
 .../logging/log4j/core/pattern/MaxLengthConverter.java       | 2 ++
 .../logging/log4j/core/pattern/MdcPatternConverter.java      | 2 ++
 .../logging/log4j/core/pattern/MessagePatternConverter.java  | 4 +++-
 .../apache/logging/log4j/core/pattern/NameAbbreviator.java   | 3 +++
 .../logging/log4j/core/pattern/NamePatternConverter.java     | 3 +++
 .../logging/log4j/core/pattern/NanoTimePatternConverter.java | 2 ++
 .../log4j/core/pattern/RelativeTimePatternConverter.java     | 2 ++
 .../log4j/core/pattern/SequenceNumberPatternConverter.java   | 2 ++
 .../apache/logging/log4j/core/pattern/StyleConverter.java    | 2 ++
 .../logging/log4j/core/pattern/ThreadIdPatternConverter.java | 4 +++-
 .../log4j/core/pattern/ThreadNamePatternConverter.java       | 2 ++
 .../log4j/core/pattern/ThreadPriorityPatternConverter.java   | 4 +++-
 26 files changed, 61 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
index 19edde5..4f21d48 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
@@ -28,12 +28,14 @@ import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.datetime.FastDateFormat;
 import org.apache.logging.log4j.core.util.datetime.FixedDateFormat;
 import org.apache.logging.log4j.core.util.datetime.FixedDateFormat.FixedFormat;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Converts and formats the event's date in a StringBuilder.
  */
 @Plugin(name = "DatePatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({"d", "date"})
+@PerformanceSensitive("allocation")
 public final class DatePatternConverter extends LogEventPatternConverter implements ArrayPatternConverter {
 
     private abstract static class Formatter {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
index 61cb266..df4571a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
@@ -19,10 +19,12 @@ package org.apache.logging.log4j.core.pattern;
 import java.util.List;
 
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Equals pattern converter.
  */
+@PerformanceSensitive("allocation")
 public abstract class EqualsBaseReplacementConverter extends LogEventPatternConverter {
     private final List<PatternFormatter> formatters;
     private final List<PatternFormatter> substitutionFormatters;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
index 6f46c03..d104241 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
@@ -21,12 +21,14 @@ import java.util.List;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Equals ignore case pattern converter.
  */
 @Plugin(name = "equalsIgnoreCase", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "equalsIgnoreCase" })
+@PerformanceSensitive("allocation")
 public final class EqualsIgnoreCaseReplacementConverter extends EqualsBaseReplacementConverter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
index 4ccb0c5..d1c62fe 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
@@ -21,12 +21,14 @@ import java.util.List;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Equals pattern converter.
  */
 @Plugin(name = "equals", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "equals" })
+@PerformanceSensitive("allocation")
 public final class EqualsReplacementConverter extends EqualsBaseReplacementConverter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
index 7a83d78..c9eb039 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Formats a date by delegating to {@link DatePatternConverter}.  The default
@@ -25,6 +26,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
  */
 @Plugin(name = "FileDatePatternConverter", category = "FileConverter")
 @ConverterKeys({ "d", "date" })
+@PerformanceSensitive("allocation")
 public final class FileDatePatternConverter {
     /**
      * Private constructor.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java
index 18369db..0b9f2b9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java
@@ -17,9 +17,12 @@
 
 package org.apache.logging.log4j.core.pattern;
 
+import org.apache.logging.log4j.util.PerformanceSensitive;
+
 /**
  * Modifies the output of a pattern converter for a specified minimum and maximum width and alignment.
  */
+@PerformanceSensitive("allocation")
 public final class FormattingInfo {
     /**
      * Array of spaces.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
index beea9bd..eb46a7a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
@@ -27,6 +27,7 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.Strings;
 
 /**
@@ -68,6 +69,7 @@ import org.apache.logging.log4j.util.Strings;
  */
 @Plugin(name = "highlight", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "highlight" })
+@PerformanceSensitive("allocation")
 public final class HighlightConverter extends LogEventPatternConverter implements AnsiConverter {
 
     private static final Map<Level, String> DEFAULT_STYLES = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
index 9e6d419..dab661d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
@@ -19,12 +19,14 @@ package org.apache.logging.log4j.core.pattern;
 import java.util.Date;
 
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Formats an integer.
  */
 @Plugin(name = "IntegerPatternConverter", category = "FileConverter")
 @ConverterKeys({ "i", "index" })
+@PerformanceSensitive("allocation")
 public final class IntegerPatternConverter extends AbstractPatternConverter implements ArrayPatternConverter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
index c044afd..debee5a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
@@ -24,12 +24,14 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.util.Patterns;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Returns the event's level in a StringBuilder.
  */
 @Plugin(name = "LevelPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "p", "level" })
+@PerformanceSensitive("allocation")
 public final class LevelPatternConverter extends LogEventPatternConverter {
     private static final String OPTION_LENGTH = "length";
     private static final String OPTION_LOWER = "lowerCase";

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
index 47c3f5a..1d7b022 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.Strings;
 
 /**
@@ -25,6 +26,7 @@ import org.apache.logging.log4j.util.Strings;
  */
 @Plugin(name = "LineSeparatorPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "n" })
+@PerformanceSensitive("allocation")
 public final class LineSeparatorPatternConverter extends LogEventPatternConverter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
index 0751bca..2e24706 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
@@ -19,13 +19,15 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.util.OptionConverter;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 
 /**
  * Formats a string literal.
  */
+@PerformanceSensitive("allocation") // except for replacements
 public final class LiteralPatternConverter extends LogEventPatternConverter implements ArrayPatternConverter {
-    
+
     /**
      * String literal.
      */
@@ -57,7 +59,7 @@ public final class LiteralPatternConverter extends LogEventPatternConverter impl
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
         toAppendTo.append(substitute ? config.getStrSubstitutor().replace(event, literal) : literal);
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -87,5 +89,5 @@ public final class LiteralPatternConverter extends LogEventPatternConverter impl
     public String toString() {
         return "LiteralPatternConverter[literal=" + literal + ", config=" + config + ", substitute=" + substitute + "]";
     }
-    
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
index d6b43c0..609af7a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 
 /**
@@ -25,6 +26,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
  */
 @Plugin(name = "LoggerPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "c", "logger" })
+@PerformanceSensitive("allocation")
 public final class LoggerPatternConverter extends NamePatternConverter {
     /**
      * Singleton.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
index c3c4857..dde5502 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.StringBuilders;
 
 /**
@@ -26,6 +27,7 @@ import org.apache.logging.log4j.util.StringBuilders;
  */
 @Plugin(name = "MarkerPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "marker" })
+@PerformanceSensitive("allocation")
 public final class MarkerPatternConverter extends LogEventPatternConverter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
index 525641c..b274eb1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
@@ -19,12 +19,14 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Appends an event's maker name to a StringBuilder.
  */
 @Plugin(name = "MarkerNamePatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "markerSimpleName" })
+@PerformanceSensitive("allocation")
 public final class MarkerSimpleNamePatternConverter extends LogEventPatternConverter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
index 8fb9270..1a59a4b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Max length pattern converter. Limit contained text to a maximum length.
@@ -36,6 +37,7 @@ import org.apache.logging.log4j.core.layout.PatternLayout;
  */
 @Plugin(name = "maxLength", category = PatternConverter.CATEGORY)
 @ConverterKeys({"maxLength", "maxLen"})
+@PerformanceSensitive("allocation")
 public final class MaxLengthConverter extends LogEventPatternConverter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
index 599d623..7e99770 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core.pattern;
 
+import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
@@ -32,6 +33,7 @@ import org.apache.logging.log4j.util.StringBuilders;
  */
 @Plugin(name = "MdcPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "X", "mdc", "MDC" })
+@PerformanceSensitive("allocation")
 public final class MdcPatternConverter extends LogEventPatternConverter {
 
     private static final ThreadLocal<StringBuilder> threadLocal = new ThreadLocal<>();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
index 9050dec..1cecfd5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.MultiformatMessage;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 
 /**
@@ -33,6 +34,7 @@ import org.apache.logging.log4j.util.StringBuilderFormattable;
  */
 @Plugin(name = "MessagePatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "m", "msg", "message" })
+@PerformanceSensitive("allocation")
 public final class MessagePatternConverter extends LogEventPatternConverter {
 
     private static final String NOLOOKUPS = "nolookups";
@@ -44,7 +46,7 @@ public final class MessagePatternConverter extends LogEventPatternConverter {
 
     /**
      * Private constructor.
-     * 
+     *
      * @param options
      *            options, may be null.
      */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
index 4cd28fb..2fb6ea9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
@@ -19,10 +19,13 @@ package org.apache.logging.log4j.core.pattern;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.logging.log4j.util.PerformanceSensitive;
+
 
 /**
  * NameAbbreviator generates abbreviated logger and class names.
  */
+@PerformanceSensitive("allocation")
 public abstract class NameAbbreviator {
     /**
      * Default (no abbreviation) abbreviator.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java
index a33a9cc..d6ba52d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java
@@ -17,9 +17,12 @@
 package org.apache.logging.log4j.core.pattern;
 
 
+import org.apache.logging.log4j.util.PerformanceSensitive;
+
 /**
  * Abstract base class for other pattern converters which can return only parts of their name.
  */
+@PerformanceSensitive("allocation")
 public abstract class NamePatternConverter extends LogEventPatternConverter {
     /**
      * Abbreviator.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
index 3d11447..ba6186b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
@@ -18,12 +18,14 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Converts and formats the event's nanoTime in a StringBuilder.
  */
 @Plugin(name = "NanoTimePatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "N", "nano" })
+@PerformanceSensitive("allocation")
 public final class NanoTimePatternConverter extends LogEventPatternConverter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
index 98e3d5e..ffc1ed4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
@@ -20,12 +20,14 @@ import java.lang.management.ManagementFactory;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Returns the relative time in milliseconds since JVM Startup.
  */
 @Plugin(name = "RelativeTimePatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "r", "relative" })
+@PerformanceSensitive("allocation")
 public class RelativeTimePatternConverter extends LogEventPatternConverter {
     private final long startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
index ef52b42..b607cbf 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
@@ -20,12 +20,14 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Formats the event sequence number.
  */
 @Plugin(name = "SequenceNumberPatternConverter", category = "Converter")
 @ConverterKeys({ "sn", "sequenceNumber" })
+@PerformanceSensitive("allocation")
 public final class SequenceNumberPatternConverter extends LogEventPatternConverter {
 
     private static final AtomicLong SEQUENCE = new AtomicLong();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
index 0d8c730..3c100e3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
@@ -24,12 +24,14 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.Patterns;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Style pattern converter. Adds ANSI color styling to the result of the enclosed pattern.
  */
 @Plugin(name = "style", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "style" })
+@PerformanceSensitive("allocation")
 public final class StyleConverter extends LogEventPatternConverter implements AnsiConverter {
 
     private final List<PatternFormatter> patternFormatters;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
index 4acfd61..1f5bc12 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
@@ -18,14 +18,16 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Formats the event thread ID.
- * 
+ *
  * @since 2.6
  */
 @Plugin(name = "ThreadIdPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "T", "tid", "threadId" })
+@PerformanceSensitive("allocation")
 public final class ThreadIdPatternConverter extends LogEventPatternConverter {
     /**
      * Singleton.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
index 8336e88..de3e824 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
@@ -18,12 +18,14 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Formats the event thread name.
  */
 @Plugin(name = "ThreadPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "t", "tn", "thread", "threadName" })
+@PerformanceSensitive("allocation")
 public final class ThreadNamePatternConverter extends LogEventPatternConverter {
     /**
      * Singleton.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76d78fe9/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
index 31ae15d..b520892 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
@@ -18,14 +18,16 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Formats the event thread priority.
- * 
+ *
  * @since 2.6
  */
 @Plugin(name = "ThreadPriorityPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "tp", "threadPriority" })
+@PerformanceSensitive("allocation")
 public final class ThreadPriorityPatternConverter extends LogEventPatternConverter {
     /**
      * Singleton.


[23/31] logging-log4j2 git commit: LOG4J2-1671 make EqualsIgnoreCaseReplacementConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1671 make EqualsIgnoreCaseReplacementConverter 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/9ca35761
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/9ca35761
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/9ca35761

Branch: refs/heads/LOG4J2-1661
Commit: 9ca35761c2f83f54278a88a881415f9a3ed56187
Parents: 69e7981
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 23:07:48 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 23:07:48 2016 +0900

----------------------------------------------------------------------
 .../pattern/EqualsBaseReplacementConverter.java | 97 ++++++++++++++++++++
 .../EqualsIgnoreCaseReplacementConverter.java   | 49 ++++------
 .../pattern/EqualsReplacementConverter.java     | 53 +----------
 3 files changed, 119 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ca35761/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
new file mode 100644
index 0000000..61cb266
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
@@ -0,0 +1,97 @@
+/*
+ * 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.core.pattern;
+
+import java.util.List;
+
+import org.apache.logging.log4j.core.LogEvent;
+
+/**
+ * Equals pattern converter.
+ */
+public abstract class EqualsBaseReplacementConverter extends LogEventPatternConverter {
+    private final List<PatternFormatter> formatters;
+    private final List<PatternFormatter> substitutionFormatters;
+    private final String substitution;
+    private final String testString;
+
+    /**
+     * Construct the converter.
+     *
+     * @param name          converter name
+     * @param style         converter style
+     * @param formatters   The PatternFormatters to generate the text to manipulate.
+     * @param testString   The test string.
+     * @param substitution The substitution string.
+     * @param parser        The PatternParser.
+     */
+    protected EqualsBaseReplacementConverter(final String name, final String style,
+                                            final List<PatternFormatter> formatters, final String testString,
+                                            final String substitution, final PatternParser parser) {
+        super(name, style);
+        this.testString = testString;
+        this.substitution = substitution;
+        this.formatters = formatters;
+
+        // check if substitution needs to be parsed
+        substitutionFormatters = substitution.contains("%") ? parser.parse(substitution) : null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void format(final LogEvent event, final StringBuilder toAppendTo) {
+        final int initialSize = toAppendTo.length();
+        for (int i = 0; i < formatters.size(); i++) {
+            final PatternFormatter formatter = formatters.get(i);
+            formatter.format(event, toAppendTo);
+        }
+        if (equals(testString, toAppendTo, initialSize, toAppendTo.length() - initialSize)) {
+            toAppendTo.setLength(initialSize);
+            parseSubstitution(event, toAppendTo);
+        }
+    }
+
+    /**
+     * Returns true if the specified String equals the specified section of the specified StringBuilder.
+     *
+     * @param str the String to compare
+     * @param buff the StringBuilder to compare a section of
+     * @param from start index in the StringBuilder
+     * @param len length of the section in the StringBuilder
+     * @return true if equal, false otherwise
+     */
+    protected abstract boolean equals(String str, StringBuilder buff, int from, int len);
+
+    /**
+     * Adds the parsed substitution text to the specified buffer.
+     *
+     * @param event the current log event
+     * @param substitutionBuffer the StringBuilder to append the parsed substitution text to
+     */
+    void parseSubstitution(final LogEvent event, final StringBuilder substitutionBuffer) {
+        if (substitutionFormatters != null) {
+            for (int i = 0; i < substitutionFormatters.size(); i++) {
+                final PatternFormatter formatter = substitutionFormatters.get(i);
+                formatter.format(event, substitutionBuffer);
+            }
+        } else {
+            substitutionBuffer.append(substitution);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ca35761/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
index 1265108..6f46c03 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.core.pattern;
 
 import java.util.List;
 
-import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
@@ -28,7 +27,7 @@ import org.apache.logging.log4j.core.layout.PatternLayout;
  */
 @Plugin(name = "equalsIgnoreCase", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "equalsIgnoreCase" })
-public final class EqualsIgnoreCaseReplacementConverter extends LogEventPatternConverter {
+public final class EqualsIgnoreCaseReplacementConverter extends EqualsBaseReplacementConverter {
 
     /**
      * Gets an instance of the class.
@@ -59,43 +58,31 @@ public final class EqualsIgnoreCaseReplacementConverter extends LogEventPatternC
         final String p = options[1];
         final PatternParser parser = PatternLayout.createPatternParser(config);
         final List<PatternFormatter> formatters = parser.parse(options[0]);
-        return new EqualsIgnoreCaseReplacementConverter(formatters, p, options[2]);
+        return new EqualsIgnoreCaseReplacementConverter(formatters, p, options[2], parser);
     }
 
-    private final List<PatternFormatter> formatters;
-
-    private final String substitution;
-
-    private final String testString;
-
     /**
      * Construct the converter.
-     * 
-     * @param formatters
-     *            The PatternFormatters to generate the text to manipulate.
-     * @param testString
-     *            The test string.
-     * @param substitution
-     *            The substitution string.
+     *
+     * @param formatters   The PatternFormatters to generate the text to manipulate.
+     * @param testString   The test string.
+     * @param substitution The substitution string.
+     * @param parser        The PatternParser.
      */
     private EqualsIgnoreCaseReplacementConverter(final List<PatternFormatter> formatters, final String testString,
-            final String substitution) {
-        super("equals", "equals");
-        this.testString = testString;
-        this.substitution = substitution;
-        this.formatters = formatters;
+            final String substitution, final PatternParser parser) {
+        super("equalsIgnoreCase", "equalsIgnoreCase", formatters, testString, substitution, parser);
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        final StringBuilder buf = new StringBuilder();
-        for (final PatternFormatter formatter : formatters) {
-            formatter.format(event, buf);
+    protected boolean equals(String str, StringBuilder buff, int from, int len) {
+        if (str.length() == len) {
+            for (int i = 0; i < len; i++) {
+                if (Character.toLowerCase(str.charAt(i)) != Character.toLowerCase(buff.charAt(i + from))) {
+                    return false;
+                }
+            }
+            return true;
         }
-        final String string = buf.toString();
-        toAppendTo.append(testString.equalsIgnoreCase(string) ? substitution : string);
+        return false;
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ca35761/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
index 7b50d25..4ccb0c5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.core.pattern;
 
 import java.util.List;
 
-import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
@@ -28,7 +27,7 @@ import org.apache.logging.log4j.core.layout.PatternLayout;
  */
 @Plugin(name = "equals", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "equals" })
-public final class EqualsReplacementConverter extends LogEventPatternConverter {
+public final class EqualsReplacementConverter extends EqualsBaseReplacementConverter {
 
     /**
      * Gets an instance of the class.
@@ -60,47 +59,20 @@ public final class EqualsReplacementConverter extends LogEventPatternConverter {
         return new EqualsReplacementConverter(formatters, p, options[2], parser);
     }
 
-    private final List<PatternFormatter> formatters;
-    private final List<PatternFormatter> substitutionFormatters;
-    private final String substitution;
-    private final String testString;
-
     /**
      * Construct the converter.
      *
      * @param formatters   The PatternFormatters to generate the text to manipulate.
      * @param testString   The test string.
      * @param substitution The substitution string.
-     * @param parser       The PatternParser.
+     * @param parser        The PatternParser.
      */
     private EqualsReplacementConverter(final List<PatternFormatter> formatters, final String testString,
                                        final String substitution, final PatternParser parser) {
-        super("equals", "equals");
-        this.testString = testString;
-        this.substitution = substitution;
-        this.formatters = formatters;
-
-        // check if substitution needs to be parsed
-        substitutionFormatters = substitution.contains("%") ? parser.parse(substitution) : null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        final int initialSize = toAppendTo.length();
-        for (int i = 0; i < formatters.size(); i++) {
-            final PatternFormatter formatter = formatters.get(i);
-            formatter.format(event, toAppendTo);
-        }
-        if (equals(testString, toAppendTo, initialSize, toAppendTo.length() - initialSize)) {
-            toAppendTo.setLength(initialSize);
-            parseSubstitution(event, toAppendTo);
-        }
+        super("equals", "equals", formatters, testString, substitution, parser);
     }
 
-    private static boolean equals(String str, StringBuilder buff, int from, int len) {
+    protected boolean equals(String str, StringBuilder buff, int from, int len) {
         if (str.length() == len) {
             for (int i = 0; i < len; i++) {
                 if (str.charAt(i) != buff.charAt(i + from)) {
@@ -111,21 +83,4 @@ public final class EqualsReplacementConverter extends LogEventPatternConverter {
         }
         return false;
     }
-
-    /**
-     * Adds the parsed substitution text to the specified buffer.
-     *
-     * @param event the current log event
-     * @param substitutionBuffer the StringBuilder to append the parsed substitution text to
-     */
-    void parseSubstitution(final LogEvent event, final StringBuilder substitutionBuffer) {
-        if (substitutionFormatters != null) {
-            for (int i = 0; i < substitutionFormatters.size(); i++) {
-                final PatternFormatter formatter = substitutionFormatters.get(i);
-                formatter.format(event, substitutionBuffer);
-            }
-        } else {
-            substitutionBuffer.append(substitution);
-        }
-    }
 }


[19/31] logging-log4j2 git commit: LOG4J2-1668 make MarkerPatternConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1668 make MarkerPatternConverter 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/78adf687
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/78adf687
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/78adf687

Branch: refs/heads/LOG4J2-1661
Commit: 78adf687b8ccbd2e626ce3cb063a24c16f879818
Parents: d7871ca
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 20:26:33 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 20:26:33 2016 +0900

----------------------------------------------------------------------
 .../java/org/apache/logging/log4j/MarkerManager.java   | 13 ++++++++++---
 .../log4j/core/pattern/MarkerPatternConverter.java     |  5 +++--
 .../logging/log4j/core/GcFreeLoggingTestUtil.java      |  7 ++++++-
 log4j-core/src/test/resources/gcFreeLogging.xml        |  6 +++---
 .../src/test/resources/gcFreeMixedSyncAsyncLogging.xml |  6 +++---
 src/changes/changes.xml                                |  3 +++
 6 files changed, 28 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java b/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
index a8c7756..8843883 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
@@ -21,6 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util.StringBuilderFormattable;
 
 /**
  * Applications create Markers by using the Marker Manager. All Markers created by this Manager are immutable.
@@ -110,7 +111,7 @@ public final class MarkerManager {
      * is moved to this package and would of course stay in its current module.</em>
      * </p>
      */
-    public static class Log4jMarker implements Marker {
+    public static class Log4jMarker implements Marker, StringBuilderFormattable {
 
         private static final long serialVersionUID = 100L;
 
@@ -364,12 +365,18 @@ public final class MarkerManager {
         @Override
         public String toString() {
             // FIXME: might want to use an initial capacity; the default is 16 (or str.length() + 16)
-            final StringBuilder sb = new StringBuilder(name);
+            final StringBuilder sb = new StringBuilder();
+            formatTo(sb);
+            return sb.toString();
+        }
+
+        @Override
+        public void formatTo(final StringBuilder sb) {
+            sb.append(name);
             final Marker[] localParents = parents;
             if (localParents != null) {
                 addParentInfo(sb, localParents);
             }
-            return sb.toString();
         }
 
         @PerformanceSensitive("allocation")

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
index af29f06..c3c4857 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
@@ -19,9 +19,10 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.util.StringBuilders;
 
 /**
- * Returns events' full maker string in a StringBuilder.
+ * Returns events' full marker string in a StringBuilder.
  */
 @Plugin(name = "MarkerPatternConverter", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "marker" })
@@ -52,7 +53,7 @@ public final class MarkerPatternConverter extends LogEventPatternConverter {
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
         final Marker marker = event.getMarker();
         if (marker != null) {
-            toAppendTo.append(marker.toString());
+            StringBuilders.appendValue(toAppendTo, marker);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
index 51a0b96..2136fc4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.util.Constants;
@@ -54,7 +55,11 @@ public class GcFreeLoggingTestUtil {
         assertFalse("Constants.IS_WEB_APP", Constants.IS_WEB_APP);
 
         final MyCharSeq myCharSeq = new MyCharSeq();
-        MarkerManager.getMarker("test"); // initial creation, value is cached
+        final Marker test = MarkerManager.getMarker("test"); // initial creation, value is cached
+        final Marker testParent = MarkerManager.getMarker("testParent");
+        final Marker testGrandParent = MarkerManager.getMarker("testGrandParent");
+        testParent.addParents(testGrandParent);
+        test.addParents(testParent);
 
         // initialize LoggerContext etc.
         // This is not steady-state logging and will allocate objects.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/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 b677dd0..41101eb 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefile.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFile.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAF.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/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 fbdafeb..62a7885 100644
--- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefileMixed.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFileMixed.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAFMixed.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %sn %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 6602d98..72be3fa 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-1668" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in MarkerPatternConverter.
+      </action>
       <action issue="LOG4J2-1667" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in SequenceNumberPatternConverter.
       </action>


[03/31] logging-log4j2 git commit: POM clean up.

Posted by mi...@apache.org.
POM clean up.

The parent POM does not compile anything, so it does not need to
configure the compiler. The configuration in the parent POM's plugin
management section is inherited by children.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/db38f186
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/db38f186
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/db38f186

Branch: refs/heads/LOG4J2-1661
Commit: db38f186d9cee8b79f9b2d145abe5357fd714961
Parents: 4fe4086
Author: Gary Gregory <gg...@apache.org>
Authored: Fri Nov 4 15:59:02 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Fri Nov 4 15:59:02 2016 -0700

----------------------------------------------------------------------
 pom.xml | 11 -----------
 1 file changed, 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/db38f186/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 16626b3..242c4fc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -916,17 +916,6 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>${maven.compile.source}</source>
-          <target>${maven.compile.target}</target>
-          <showDeprecation>true</showDeprecation>
-          <showWarnings>true</showWarnings>
-          <compilerArguments>
-            <Xmaxwarns>10000</Xmaxwarns>
-            <Xlint />
-          </compilerArguments>
-          <encoding>UTF-8</encoding>
-        </configuration>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>


[16/31] logging-log4j2 git commit: LOG4J2-1665 make IntegerPatternConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1665 make IntegerPatternConverter 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/84e16b88
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/84e16b88
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/84e16b88

Branch: refs/heads/LOG4J2-1661
Commit: 84e16b8843f32c124f623ffdec8a68e20cc5483a
Parents: e0058d6
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 15:59:00 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 15:59:00 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/pattern/IntegerPatternConverter.java | 16 +++++++---------
 src/changes/changes.xml                             |  3 +++
 2 files changed, 10 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/84e16b88/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
index 5380d45..9e6d419 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
@@ -20,14 +20,13 @@ import java.util.Date;
 
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 
-
 /**
  * Formats an integer.
  */
 @Plugin(name = "IntegerPatternConverter", category = "FileConverter")
 @ConverterKeys({ "i", "index" })
 public final class IntegerPatternConverter extends AbstractPatternConverter implements ArrayPatternConverter {
-    
+
     /**
      * Singleton.
      */
@@ -46,16 +45,15 @@ public final class IntegerPatternConverter extends AbstractPatternConverter impl
      * @param options options, may be null.
      * @return instance of pattern converter.
      */
-    public static IntegerPatternConverter newInstance(
-        final String[] options) {
+    public static IntegerPatternConverter newInstance(final String[] options) {
         return INSTANCE;
     }
 
     @Override
     public void format(final StringBuilder toAppendTo, final Object... objects) {
-        for (final Object obj : objects) {
-            if (obj instanceof Integer) {
-                format(obj, toAppendTo);
+        for (int i = 0; i < objects.length; i++) {
+            if (objects[i] instanceof Integer) {
+                format(objects[i], toAppendTo);
                 break;
             }
         }
@@ -67,9 +65,9 @@ public final class IntegerPatternConverter extends AbstractPatternConverter impl
     @Override
     public void format(final Object obj, final StringBuilder toAppendTo) {
         if (obj instanceof Integer) {
-            toAppendTo.append(obj.toString());
+            toAppendTo.append(((Integer) obj).intValue());
         } else if (obj instanceof Date) {
-            toAppendTo.append(Long.toString(((Date) obj).getTime()));
+            toAppendTo.append(((Date) obj).getTime());
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/84e16b88/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index a204389..1925175 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-1665" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in IntegerPatternConverter.
+      </action>
       <action issue="LOG4J2-1637" dev="rpopma" type="fix">
         Fixed problems when used in OSGi containers (IllegalAccessError, NoClassDefFoundError).
       </action>


[30/31] logging-log4j2 git commit: LOG4J2-1595 mark garbage-free Filters with the @PerformanceSensitive("allocation") annotation

Posted by mi...@apache.org.
LOG4J2-1595 mark garbage-free Filters with the @PerformanceSensitive("allocation") annotation


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/62ddffd3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/62ddffd3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/62ddffd3

Branch: refs/heads/LOG4J2-1661
Commit: 62ddffd35d828abd4d0b504b32aa9c96ee00a0ca
Parents: 76d78fe
Author: rpopma <rp...@apache.org>
Authored: Mon Nov 7 07:46:01 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Mon Nov 7 07:46:01 2016 +0900

----------------------------------------------------------------------
 .../java/org/apache/logging/log4j/core/filter/CompositeFilter.java | 2 ++
 .../apache/logging/log4j/core/filter/DynamicThresholdFilter.java   | 2 ++
 .../org/apache/logging/log4j/core/filter/LevelRangeFilter.java     | 2 ++
 .../java/org/apache/logging/log4j/core/filter/MarkerFilter.java    | 2 ++
 .../java/org/apache/logging/log4j/core/filter/ThresholdFilter.java | 2 ++
 5 files changed, 10 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/62ddffd3/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
index 976e05d..c61bf57 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
@@ -35,11 +35,13 @@ import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.util.ObjectArrayIterator;
 import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Composes and invokes one or more filters.
  */
 @Plugin(name = "filters", category = Node.CATEGORY, printObject = true)
+@PerformanceSensitive("allocation")
 public final class CompositeFilter extends AbstractLifeCycle implements Iterable<Filter>, Filter {
 
     private static final Filter[] EMPTY_FILTERS = new Filter[0];

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/62ddffd3/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java
----------------------------------------------------------------------
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 86373a5..92a8433 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
@@ -35,6 +35,7 @@ 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;
 
 /**
@@ -43,6 +44,7 @@ import org.apache.logging.log4j.util.ReadOnlyStringMap;
  * {@link ContextDataInjector} which obtains context data from some other source.
  */
 @Plugin(name = "DynamicThresholdFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
+@PerformanceSensitive("allocation")
 public final class DynamicThresholdFilter extends AbstractFilter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/62ddffd3/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
index 627b438..8f4769c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * This filter returns the {@code onMatch} result if the level in the {@code LogEvent} is in the range of the configured
@@ -38,6 +39,7 @@ import org.apache.logging.log4j.message.Message;
  * </p>
  */
 @Plugin(name = "LevelRangeFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
+@PerformanceSensitive("allocation")
 public final class LevelRangeFilter extends AbstractFilter {
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/62ddffd3/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
index c61c612..d56b603 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
@@ -26,12 +26,14 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * This filter returns the onMatch result if the marker in the LogEvent is the same as or has the
  * configured marker as a parent.
  */
 @Plugin(name = "MarkerFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
+@PerformanceSensitive("allocation")
 public final class MarkerFilter extends AbstractFilter {
 
     private final String name;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/62ddffd3/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
index e860c72..641cb66 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * This filter returns the onMatch result if the level in the LogEvent is the same or more specific
@@ -36,6 +37,7 @@ import org.apache.logging.log4j.message.Message;
  * The default Level is ERROR.
  */
 @Plugin(name = "ThresholdFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
+@PerformanceSensitive("allocation")
 public final class ThresholdFilter extends AbstractFilter {
 
     private final Level level;


[02/31] logging-log4j2 git commit: Fix warning.

Posted by mi...@apache.org.
Fix warning.

The compiler plugin version is already defined in the plugin management
section.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4fe4086a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4fe4086a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4fe4086a

Branch: refs/heads/LOG4J2-1661
Commit: 4fe4086adfccf4505b4f4065a80b9512efbc7a4e
Parents: b6ad0b2
Author: Gary Gregory <gg...@apache.org>
Authored: Fri Nov 4 15:47:40 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Fri Nov 4 15:47:40 2016 -0700

----------------------------------------------------------------------
 pom.xml | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4fe4086a/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 82a001d..16626b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -916,7 +916,6 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
-        <version>${compiler.plugin.version}</version>
         <configuration>
           <source>${maven.compile.source}</source>
           <target>${maven.compile.target}</target>


[18/31] logging-log4j2 git commit: LOG4J2-1667 make SequenceNumberPatternConverter garbage-free

Posted by mi...@apache.org.
LOG4J2-1667 make SequenceNumberPatternConverter 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/d7871ca6
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/d7871ca6
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/d7871ca6

Branch: refs/heads/LOG4J2-1661
Commit: d7871ca649310debe18e3ec37a7510c53d0615ea
Parents: 79acbcb
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 16:23:26 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 16:23:26 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/pattern/SequenceNumberPatternConverter.java     | 5 ++---
 log4j-core/src/test/resources/gcFreeLogging.xml                | 6 +++---
 log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml  | 6 +++---
 src/changes/changes.xml                                        | 3 +++
 4 files changed, 11 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d7871ca6/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
index b8e4b6a..ef52b42 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
@@ -49,8 +49,7 @@ public final class SequenceNumberPatternConverter extends LogEventPatternConvert
      * @param options options, currently ignored, may be null.
      * @return instance of SequencePatternConverter.
      */
-    public static SequenceNumberPatternConverter newInstance(
-        final String[] options) {
+    public static SequenceNumberPatternConverter newInstance(final String[] options) {
         return INSTANCE;
     }
 
@@ -59,6 +58,6 @@ public final class SequenceNumberPatternConverter extends LogEventPatternConvert
      */
     @Override
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        toAppendTo.append(Long.toString(SEQUENCE.incrementAndGet()));
+        toAppendTo.append(SEQUENCE.incrementAndGet());
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d7871ca6/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 f91eb11..b677dd0 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefile.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFile.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAF.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d7871ca6/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 c5f77ec..fbdafeb 100644
--- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml
@@ -6,13 +6,13 @@
     </Console>
     <File name="File" fileName="target/gcfreefileMixed.log" bufferedIO="false">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFileMixed.log"
         filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
-        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
+        <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern>
       </PatternLayout>
       <Policies>
         <SizeBasedTriggeringPolicy size="50M" />
@@ -20,7 +20,7 @@
     </RollingFile>
     <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAFMixed.log" immediateFlush="false" append="false">
       <PatternLayout>
-        <Pattern>%d{DEFAULT}{UTC} %r %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
+        <Pattern>%d{DEFAULT}{UTC} %r %sn %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern>
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d7871ca6/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 66c5c35..6602d98 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-1667" dev="rpopma" type="fix">
+        (GC) Avoid allocating temporary objects in SequenceNumberPatternConverter.
+      </action>
       <action issue="LOG4J2-1666" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in RelativeTimePatternConverter.
       </action>


[15/31] logging-log4j2 git commit: LOG4J2-1648 SPI interface for putting Object values in the ThreadContextMap (no end-user visible API yet)

Posted by mi...@apache.org.
LOG4J2-1648 SPI interface for putting Object values in the ThreadContextMap (no end-user visible API yet)


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/e0058d67
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/e0058d67
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/e0058d67

Branch: refs/heads/LOG4J2-1661
Commit: e0058d672121a10a3deb88709fda708e51eddcf4
Parents: 7696120
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 10:25:23 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 10:25:23 2016 +0900

----------------------------------------------------------------------
 .../CopyOnWriteSortedArrayThreadContextMap.java | 14 ++++++-
 .../GarbageFreeSortedArrayThreadContextMap.java | 14 ++++++-
 .../log4j/spi/ObjectThreadContextMap.java       | 44 ++++++++++++++++++++
 3 files changed, 68 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e0058d67/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 d346d0e..3b91dbb 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
@@ -34,7 +34,7 @@ import org.apache.logging.log4j.util.PropertiesUtil;
  *
  * @since 2.7
  */
-class CopyOnWriteSortedArrayThreadContextMap implements ReadOnlyThreadContextMap, ThreadContextMap2, CopyOnWrite {
+class CopyOnWriteSortedArrayThreadContextMap implements ReadOnlyThreadContextMap, ObjectThreadContextMap, CopyOnWrite {
 
     /**
      * Property name ({@value} ) for selecting {@code InheritableThreadLocal} (value "true") or plain
@@ -107,6 +107,11 @@ class CopyOnWriteSortedArrayThreadContextMap implements ReadOnlyThreadContextMap
 
     @Override
     public void put(final String key, final String value) {
+        putValue(key, value);
+    }
+
+    @Override
+    public void putValue(final String key, final Object value) {
         StringMap map = localMap.get();
         map = map == null ? createStringMap() : createStringMap(map);
         map.putValue(key, value);
@@ -130,8 +135,13 @@ class CopyOnWriteSortedArrayThreadContextMap implements ReadOnlyThreadContextMap
 
     @Override
     public String get(final String key) {
+        return (String) getValue(key);
+    }
+
+    @Override
+    public Object getValue(final String key) {
         final StringMap map = localMap.get();
-        return map == null ? null : (String) map.getValue(key);
+        return map == null ? null : map.getValue(key);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e0058d67/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 d0ee369..7113d9f 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
@@ -34,7 +34,7 @@ import org.apache.logging.log4j.util.SortedArrayStringMap;
  * </p>
  * @since 2.7
  */
-class GarbageFreeSortedArrayThreadContextMap implements ReadOnlyThreadContextMap, ThreadContextMap2  {
+class GarbageFreeSortedArrayThreadContextMap implements ReadOnlyThreadContextMap, ObjectThreadContextMap  {
 
     /**
      * Property name ({@value} ) for selecting {@code InheritableThreadLocal} (value "true") or plain
@@ -115,6 +115,11 @@ class GarbageFreeSortedArrayThreadContextMap implements ReadOnlyThreadContextMap
     }
 
     @Override
+    public void putValue(final String key, final Object value) {
+        getThreadLocalMap().putValue(key, value);
+    }
+
+    @Override
     public void putAll(final Map<String, String> values) {
         if (values == null || values.isEmpty()) {
             return;
@@ -127,8 +132,13 @@ class GarbageFreeSortedArrayThreadContextMap implements ReadOnlyThreadContextMap
 
     @Override
     public String get(final String key) {
+        return (String) getValue(key);
+    }
+
+    @Override
+    public Object getValue(final String key) {
         final StringMap map = localMap.get();
-        return map == null ? null : (String) map.getValue(key);
+        return map == null ? null : map.getValue(key);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e0058d67/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
new file mode 100644
index 0000000..a3e3715
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ObjectThreadContextMap.java
@@ -0,0 +1,44 @@
+/*
+ * 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 allow putting Object values in the
+ * {@link org.apache.logging.log4j.ThreadContext}.
+ *
+ * @see ThreadContextMap2
+ * @since 2.8
+ */
+public interface ObjectThreadContextMap extends ThreadContextMap2 {
+
+    /**
+     * Returns the Object value for the specified key, or {@code null} if the specified key does not exist in this
+     * collection.
+     *
+     * @param key the key whose value to return
+     * @return the value for the specified key or {@code null}
+     */
+    <V> V getValue(String key);
+
+    /**
+     * Puts the specified key-value pair into the collection.
+     *
+     * @param key the key to add or remove. Keys may be {@code null}.
+     * @param value the value to add. Values may be {@code null}.
+     */
+    <V> void putValue(String key, V value);
+}


[06/31] logging-log4j2 git commit: LOG4J2-1663 Ensure SortedArrayStringMap can be serialized and deserialized without errors regardless of content

Posted by mi...@apache.org.
LOG4J2-1663 Ensure SortedArrayStringMap can be serialized and deserialized without errors regardless of content


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/8cd9f555
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/8cd9f555
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/8cd9f555

Branch: refs/heads/LOG4J2-1661
Commit: 8cd9f555f1e49c9d696ab9eef4596db92286ccf7
Parents: 4df78d0
Author: rpopma <rp...@apache.org>
Authored: Sat Nov 5 22:13:51 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Nov 5 22:13:51 2016 +0900

----------------------------------------------------------------------
 .../java/org/apache/logging/log4j/util/DeserializerHelper.java   | 4 ++--
 .../org/apache/logging/log4j/util/SortedArrayStringMapTest.java  | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8cd9f555/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
index 1fc8307..8fbc776 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
@@ -34,8 +34,8 @@ public class DeserializerHelper {
             final Object result = in.readObject();
             System.out.println(result);
         } catch (Throwable t) {
-            System.err.println("Could not deserialize: ");
-            t.printStackTrace();
+            System.err.println("Could not deserialize.");
+            throw t; // cause non-zero exit code
         } finally {
             try {
                 in.close();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8cd9f555/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index 58386d2..693bb5f 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -108,7 +108,7 @@ public class SortedArrayStringMapTest {
                 DeserializerHelper.class.getName(), file.getPath()).inheritIO().start();
         int exitValue = process.waitFor();
 
-//        file.delete();
+        file.delete();
         assertEquals("no error", 0, exitValue);
     }
 


[10/31] logging-log4j2 git commit: LOG4J2-1226 Improve LogEvent serialization to handle non-serializable Messages and deserializing when required classes are missing.

Posted by mi...@apache.org.
LOG4J2-1226 Improve LogEvent serialization to handle non-serializable Messages and deserializing when required classes are missing.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/c35ac444
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/c35ac444
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/c35ac444

Branch: refs/heads/LOG4J2-1661
Commit: c35ac44456d56d54118881d46798fba6143390aa
Parents: 7ec3d38
Author: rpopma <rp...@apache.org>
Authored: Sun Nov 6 00:26:02 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Nov 6 00:26:02 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/impl/Log4jLogEvent.java  | 43 +++++++++++++++++---
 .../log4j/core/impl/Log4jLogEventTest.java      |  4 +-
 src/changes/changes.xml                         |  3 ++
 3 files changed, 42 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c35ac444/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index 4759976..1b7acb2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -16,9 +16,11 @@
  */
 package org.apache.logging.log4j.core.impl;
 
+import java.io.IOException;
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
+import java.rmi.MarshalledObject;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -845,7 +847,12 @@ public class Log4jLogEvent implements LogEvent {
         private final Marker marker;
         private final Level level;
         private final String loggerName;
-        private final Message message;
+        // transient since 2.8
+        private final transient Message message;
+        /** since 2.8 */
+        private MarshalledObject<Message> marshalledMessage;
+        /** since 2.8 */
+        private String messageString;
         private final long timeMillis;
         private final transient Throwable thrown;
         private final ThrowableProxy thrownProxy;
@@ -891,10 +898,10 @@ public class Log4jLogEvent implements LogEvent {
             this.level = event.getLevel();
             this.loggerName = event.getLoggerName();
 
-            final Message msg = event.getMessage();
-            this.message = msg instanceof ReusableMessage
-                    ? memento((ReusableMessage) msg)
-                    : msg;
+            final Message temp = event.getMessage();
+            message = temp instanceof ReusableMessage
+                    ? memento((ReusableMessage) temp)
+                    : temp;
             this.timeMillis = event.getTimeMillis();
             this.thrown = event.getThrown();
             this.thrownProxy = event.getThrownProxy();
@@ -919,18 +926,42 @@ public class Log4jLogEvent implements LogEvent {
             return result;
         }
 
+        private static MarshalledObject<Message> marshall(final Message msg) {
+            try {
+                return new MarshalledObject<>(msg);
+            } catch (final Exception ex) {
+                return null;
+            }
+        }
+
+        private void writeObject(final java.io.ObjectOutputStream s) throws IOException {
+            this.messageString = message.getFormattedMessage();
+            this.marshalledMessage = marshall(message);
+            s.defaultWriteObject();
+        }
+
         /**
          * Returns a Log4jLogEvent using the data in the proxy.
          * @return Log4jLogEvent.
          */
         protected Object readResolve() {
-            final Log4jLogEvent result = new Log4jLogEvent(loggerName, marker, loggerFQCN, level, message, thrown,
+            final Log4jLogEvent result = new Log4jLogEvent(loggerName, marker, loggerFQCN, level, message(), thrown,
                     thrownProxy, contextData, contextStack, threadId, threadName, threadPriority, source, timeMillis,
                     nanoTime);
             result.setEndOfBatch(isEndOfBatch);
             result.setIncludeLocation(isLocationRequired);
             return result;
         }
+
+        private Message message() {
+            if (marshalledMessage != null) {
+                try {
+                    return marshalledMessage.get();
+                } catch (final Exception ex) {
+                }
+            }
+            return new SimpleMessage(messageString);
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c35ac444/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
index 9f079ce..57024a4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
@@ -176,7 +176,7 @@ public class Log4jLogEventTest {
         // System.out.println("final String base64 = \"" + base64Str.replaceAll("\r\n", "\\\\r\\\\n\" +\r\n\"") +
         // "\";");
 
-        final String base64 = "rO0ABXNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnQkTG9nRXZlbnRQcm94eYgtmn+yXsP9AgAPWgAMaXNFbmRPZkJhdGNoWgASaXNMb2NhdGlvblJlcXVpcmVkSgAIdGhyZWFkSWRJAA50aHJlYWRQcmlvcml0eUoACnRpbWVNaWxsaXNMAApjb250ZXh0TWFwdAAPTGphdmEvdXRpbC9NYXA7TAAMY29udGV4dFN0YWNrdAA1TG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9UaHJlYWRDb250ZXh0JENvbnRleHRTdGFjaztMAAVsZXZlbHQAIExvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovTGV2ZWw7TAAKbG9nZ2VyRlFDTnQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACmxvZ2dlck5hbWVxAH4ABEwABm1hcmtlcnQAIUxvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovTWFya2VyO0wAB21lc3NhZ2V0ACpMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL21lc3NhZ2UvTWVzc2FnZTtMAAZzb3VyY2V0AB1MamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50O0wACnRocmVhZE5hbWVxAH4ABEwAC3Rocm93blByb3h5dAAzTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvVGhyb3dhYmxlUHJveHk7eHAAAAAAAAAAAAABAAAABQAAAABJlgLSc3IAHmphdmEudXRpbC5Db2xsZWN0aW9ucyRFbXB0eU1hcFk2FIVa3OfQAgAAeHBzcgA+b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLlRocmVhZENvbnRleHQkRW1wdHlUaHJlYWRDb250ZXh0U3RhY2sAAAAAAA
 AAAQIAAHhwc3IAHm9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5MZXZlbAAAAAAAGCAaAgADSQAIaW50TGV2ZWxMAARuYW1lcQB+AARMAA1zdGFuZGFyZExldmVsdAAsTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9zcGkvU3RhbmRhcmRMZXZlbDt4cAAAAZB0AARJTkZPfnIAKm9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5zcGkuU3RhbmRhcmRMZXZlbAAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5FbnVtAAAAAAAAAAASAAB4cHQABElORk90AAB0AAlzb21lLnRlc3Rwc3IALm9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5tZXNzYWdlLlNpbXBsZU1lc3NhZ2WLdE0wYLeiqAMAAUwAB21lc3NhZ2VxAH4ABHhwdAADYWJjcQB+ABp4cHQABG1haW5zcgAxb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5UaHJvd2FibGVQcm94ednMMNWae6z6AgAHSQASY29tbW9uRWxlbWVudENvdW50TAAKY2F1c2VQcm94eXEAfgAIWwASZXh0ZW5kZWRTdGFja1RyYWNldAA/W0xvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovY29yZS9pbXBsL0V4dGVuZGVkU3RhY2tUcmFjZUVsZW1lbnQ7TAAQbG9jYWxpemVkTWVzc2FnZXEAfgAETAAHbWVzc2FnZXEAfgAETAAEbmFtZXEAfgAEWwARc3VwcHJlc3NlZFByb3hpZXN0ADRbTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvVGhyb3dhYmxlUHJveHk7eHAAAAAAcHVyAD9bTG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWV
 udDvKz4gjpcfPvAIAAHhwAAAAHXNyADxvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkV4dGVuZGVkU3RhY2tUcmFjZUVsZW1lbnTh3s+6xraQBwIAAkwADmV4dHJhQ2xhc3NJbmZvdAA2TG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvRXh0ZW5kZWRDbGFzc0luZm87TAARc3RhY2tUcmFjZUVsZW1lbnRxAH4AB3hwc3IANG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuRXh0ZW5kZWRDbGFzc0luZm8AAAAAAAAAAQIAA1oABWV4YWN0TAAIbG9jYXRpb25xAH4ABEwAB3ZlcnNpb25xAH4ABHhwAXQADXRlc3QtY2xhc3Nlcy90AAE/c3IAG2phdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudGEJxZomNt2FAgAESQAKbGluZU51bWJlckwADmRlY2xhcmluZ0NsYXNzcQB+AARMAAhmaWxlTmFtZXEAfgAETAAKbWV0aG9kTmFtZXEAfgAEeHAAAACqdAA0b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5Mb2c0akxvZ0V2ZW50VGVzdHQAFkxvZzRqTG9nRXZlbnRUZXN0LmphdmF0ACp0ZXN0SmF2YUlvU2VyaWFsaXphYmxlV2l0aFVua25vd25UaHJvd2FibGVzcQB+ACJzcQB+ACUAcQB+ACh0AAgxLjcuMF81NXNxAH4AKf////50ACRzdW4ucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGx0AB1OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuamF2YXQAB2ludm9rZTBzcQB+ACJzcQB+ACUAcQB+AChxAH4AMHNxAH4AKQAAADlxAH4AMnEAfgAzdAAGaW52b2tlc3EAfgAic3EA
 fgAlAHEAfgAocQB+ADBzcQB+ACkAAAArdAAoc3VuLnJlZmxlY3QuRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbHQAIURlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuamF2YXEAfgA4c3EAfgAic3EAfgAlAHEAfgAocQB+ADBzcQB+ACkAAAJedAAYamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kdAALTWV0aG9kLmphdmFxAH4AOHNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjEyLmphcnQABDQuMTJzcQB+ACkAAAAydAApb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuRnJhbWV3b3JrTWV0aG9kJDF0ABRGcmFtZXdvcmtNZXRob2QuamF2YXQAEXJ1blJlZmxlY3RpdmVDYWxsc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAAMdAAzb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMubW9kZWwuUmVmbGVjdGl2ZUNhbGxhYmxldAAXUmVmbGVjdGl2ZUNhbGxhYmxlLmphdmF0AANydW5zcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMi5qYXJxAH4ARnNxAH4AKQAAAC90ACdvcmcuanVuaXQucnVubmVycy5tb2RlbC5GcmFtZXdvcmtNZXRob2RxAH4ASXQAEWludm9rZUV4cGxvc2l2ZWx5c3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAARdAAyb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5JbnZva2VNZXRob2R0ABFJbnZva2VNZXRob2QuamF2YXQACGV2YWx1YXRlc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAFFdAAeb3JnLmp1b
 ml0LnJ1bm5lcnMuUGFyZW50UnVubmVydAARUGFyZW50UnVubmVyLmphdmF0AAdydW5MZWFmc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAABOdAAob3JnLmp1bml0LnJ1bm5lcnMuQmxvY2tKVW5pdDRDbGFzc1J1bm5lcnQAG0Jsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIuamF2YXQACHJ1bkNoaWxkc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAA5cQB+AGpxAH4Aa3EAfgBsc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAEidAAgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDNxAH4AZHEAfgBRc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAABHdAAgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDFxAH4AZHQACHNjaGVkdWxlc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAEgcQB+AGNxAH4AZHQAC3J1bkNoaWxkcmVuc3EAfgAic3EAfgAlAXQADmp1bml0LTQuMTIuamFycQB+AEZzcQB+ACkAAAA6cQB+AGNxAH4AZHQACmFjY2VzcyQwMDBzcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMi5qYXJxAH4ARnNxAH4AKQAAAQx0ACBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkMnEAfgBkcQB+AF5zcQB+ACJzcQB+ACUBdAAOanVuaXQtNC4xMi5qYXJxAH4ARnNxAH4AKQAAABp0ADBvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLlJ1bkJlZm
 9yZXN0AA9SdW5CZWZvcmVzLmphdmFxAH4AXnNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjEyLmphcnEAfgBGc3EAfgApAAAAG3QAL29yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuUnVuQWZ0ZXJzdAAOUnVuQWZ0ZXJzLmphdmFxAH4AXnNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjEyLmphcnEAfgBGc3EAfgApAAABa3EAfgBjcQB+AGRxAH4AUXNxAH4AInNxAH4AJQF0AA5qdW5pdC00LjEyLmphcnEAfgBGc3EAfgApAAAAiXQAGm9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JldAAOSlVuaXRDb3JlLmphdmFxAH4AUXNxAH4AInNxAH4AJQF0AAxqdW5pdC1ydC5qYXJxAH4AKHNxAH4AKQAAAEV0AChjb20uaW50ZWxsaWouanVuaXQ0LkpVbml0NElkZWFUZXN0UnVubmVydAAZSlVuaXQ0SWRlYVRlc3RSdW5uZXIuamF2YXQAE3N0YXJ0UnVubmVyV2l0aEFyZ3NzcQB+ACJzcQB+ACUBdAAManVuaXQtcnQuamFycQB+AChzcQB+ACkAAADqdAAsY29tLmludGVsbGlqLnJ0LmV4ZWN1dGlvbi5qdW5pdC5KVW5pdFN0YXJ0ZXJ0ABFKVW5pdFN0YXJ0ZXIuamF2YXQAFnByZXBhcmVTdHJlYW1zQW5kU3RhcnRzcQB+ACJzcQB+ACUBdAAManVuaXQtcnQuamFycQB+AChzcQB+ACkAAABKcQB+AKxxAH4ArXQABG1haW5zcQB+ACJzcQB+ACUAcQB+AChxAH4AMHNxAH4AKf////5xAH4AMnEAfgAzcQB+ADRzcQB+ACJzcQB+ACUAcQB+AChxAH4AMHNxAH4AKQAAADlxAH4AMnEAfgAzcQB+ADhzcQB+ACJzcQB+ACUAcQB+AChxAH4
 AMHNxAH4AKQAAACtxAH4APHEAfgA9cQB+ADhzcQB+ACJzcQB+ACUAcQB+AChxAH4AMHNxAH4AKQAAAl5xAH4AQXEAfgBCcQB+ADhzcQB+ACJzcQB+ACUBdAALaWRlYV9ydC5qYXJxAH4AKHNxAH4AKQAAAJB0AC1jb20uaW50ZWxsaWoucnQuZXhlY3V0aW9uLmFwcGxpY2F0aW9uLkFwcE1haW50AAxBcHBNYWluLmphdmFxAH4As3QAFk9NRyBJJ3ZlIGJlZW4gZGVsZXRlZCFxAH4AxnQARW9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuTG9nNGpMb2dFdmVudFRlc3QkRGVsZXRlZEV4Y2VwdGlvbnVyADRbTG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuVGhyb3dhYmxlUHJveHk7+u0B4IWi6zkCAAB4cAAAAAA=";
+        final String base64 = "rO0ABXNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnQkTG9nRXZlbnRQcm94eYgtmn+yXsP9AwAQWgAMaXNFbmRPZkJhdGNoWgASaXNMb2NhdGlvblJlcXVpcmVkSgAIdGhyZWFkSWRJAA50aHJlYWRQcmlvcml0eUoACnRpbWVNaWxsaXNMAAtjb250ZXh0RGF0YXQAKUxvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovdXRpbC9TdHJpbmdNYXA7TAAMY29udGV4dFN0YWNrdAA1TG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9UaHJlYWRDb250ZXh0JENvbnRleHRTdGFjaztMAAVsZXZlbHQAIExvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovTGV2ZWw7TAAKbG9nZ2VyRlFDTnQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACmxvZ2dlck5hbWVxAH4ABEwABm1hcmtlcnQAIUxvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovTWFya2VyO0wAEW1hcnNoYWxsZWRNZXNzYWdldAAbTGphdmEvcm1pL01hcnNoYWxsZWRPYmplY3Q7TAANbWVzc2FnZVN0cmluZ3EAfgAETAAGc291cmNldAAdTGphdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudDtMAAp0aHJlYWROYW1lcQB+AARMAAt0aHJvd25Qcm94eXQAM0xvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovY29yZS9pbXBsL1Rocm93YWJsZVByb3h5O3hwAAAAAAAAAAAAAQAAAAUAAAAASZYC0nNyADJvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGoudXRpbC5Tb3J0ZWRBcnJheVN0cmluZ01hcLA3yJFz7CvcAwACWgAJaW1tdXRhYm
 xlSQAJdGhyZXNob2xkeHABAAAAAXcIAAAAAQAAAAB4c3IAPm9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5UaHJlYWRDb250ZXh0JEVtcHR5VGhyZWFkQ29udGV4dFN0YWNrAAAAAAAAAAECAAB4cHNyAB5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouTGV2ZWwAAAAAABggGgIAA0kACGludExldmVsTAAEbmFtZXEAfgAETAANc3RhbmRhcmRMZXZlbHQALExvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovc3BpL1N0YW5kYXJkTGV2ZWw7eHAAAAGQdAAESU5GT35yACpvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouc3BpLlN0YW5kYXJkTGV2ZWwAAAAAAAAAABIAAHhyAA5qYXZhLmxhbmcuRW51bQAAAAAAAAAAEgAAeHB0AARJTkZPdAAAdAAJc29tZS50ZXN0cHNyABlqYXZhLnJtaS5NYXJzaGFsbGVkT2JqZWN0fL0el+1j/D4CAANJAARoYXNoWwAIbG9jQnl0ZXN0AAJbQlsACG9iakJ5dGVzcQB+ABl4cJNvO+xwdXIAAltCrPMX+AYIVOACAAB4cAAAAGms7QAFc3IALm9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5tZXNzYWdlLlNpbXBsZU1lc3NhZ2WLdE0wYLeiqAMAAUwAB21lc3NhZ2V0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAA2FiY3h0AANhYmNwdAAEbWFpbnNyADFvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLlRocm93YWJsZVByb3h52cww1Zp7rPoCAAdJABJjb21tb25FbGVtZW50Q291bnRMAApjYXVzZVByb3h5cQB+AAhbABJleHRlbmRlZFN0YWNrVHJhY2V0AD9bTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9
 jb3JlL2ltcGwvRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWVudDtMABBsb2NhbGl6ZWRNZXNzYWdlcQB+AARMAAdtZXNzYWdlcQB+AARMAARuYW1lcQB+AARbABFzdXBwcmVzc2VkUHJveGllc3QANFtMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1wbC9UaHJvd2FibGVQcm94eTt4cAAAAABwdXIAP1tMb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5FeHRlbmRlZFN0YWNrVHJhY2VFbGVtZW50O8rPiCOlx8+8AgAAeHAAAAAec3IAPG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuRXh0ZW5kZWRTdGFja1RyYWNlRWxlbWVudOHez7rGtpAHAgACTAAOZXh0cmFDbGFzc0luZm90ADZMb3JnL2FwYWNoZS9sb2dnaW5nL2xvZzRqL2NvcmUvaW1wbC9FeHRlbmRlZENsYXNzSW5mbztMABFzdGFja1RyYWNlRWxlbWVudHEAfgAHeHBzcgA0b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuaW1wbC5FeHRlbmRlZENsYXNzSW5mbwAAAAAAAAABAgADWgAFZXhhY3RMAAhsb2NhdGlvbnEAfgAETAAHdmVyc2lvbnEAfgAEeHABdAANdGVzdC1jbGFzc2VzL3QAAT9zcgAbamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50YQnFmiY23YUCAARJAApsaW5lTnVtYmVyTAAOZGVjbGFyaW5nQ2xhc3NxAH4ABEwACGZpbGVOYW1lcQB+AARMAAptZXRob2ROYW1lcQB+AAR4cAAAAKx0ADRvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnRUZXN0dAAWTG9nNGpMb2dFdmVudFRl
 c3QuamF2YXQAKnRlc3RKYXZhSW9TZXJpYWxpemFibGVXaXRoVW5rbm93blRocm93YWJsZXNxAH4AJXNxAH4AKABxAH4AK3QACDEuNy4wXzU1c3EAfgAs/////nQAJHN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbHQAHU5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5qYXZhdAAHaW52b2tlMHNxAH4AJXNxAH4AKABxAH4AK3EAfgAzc3EAfgAsAAAAOXEAfgA1cQB+ADZ0AAZpbnZva2VzcQB+ACVzcQB+ACgAcQB+ACtxAH4AM3NxAH4ALAAAACt0AChzdW4ucmVmbGVjdC5EZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBsdAAhRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5qYXZhcQB+ADtzcQB+ACVzcQB+ACgAcQB+ACtxAH4AM3NxAH4ALAAAAl50ABhqYXZhLmxhbmcucmVmbGVjdC5NZXRob2R0AAtNZXRob2QuamF2YXEAfgA7c3EAfgAlc3EAfgAoAXQADmp1bml0LTQuMTIuamFydAAENC4xMnNxAH4ALAAAADJ0AClvcmcuanVuaXQucnVubmVycy5tb2RlbC5GcmFtZXdvcmtNZXRob2QkMXQAFEZyYW1ld29ya01ldGhvZC5qYXZhdAARcnVuUmVmbGVjdGl2ZUNhbGxzcQB+ACVzcQB+ACgBdAAOanVuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAAAx0ADNvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5tb2RlbC5SZWZsZWN0aXZlQ2FsbGFibGV0ABdSZWZsZWN0aXZlQ2FsbGFibGUuamF2YXQAA3J1bnNxAH4AJXNxAH4AKAF0AA5qdW5pdC00LjEyLmphcnEAfgBJc3EAfgAsAAAAL3QAJ29yZy5qdW5pdC5ydW5uZ
 XJzLm1vZGVsLkZyYW1ld29ya01ldGhvZHEAfgBMdAARaW52b2tlRXhwbG9zaXZlbHlzcQB+ACVzcQB+ACgBdAAOanVuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAABF0ADJvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLkludm9rZU1ldGhvZHQAEUludm9rZU1ldGhvZC5qYXZhdAAIZXZhbHVhdGVzcQB+ACVzcQB+ACgBdAAOanVuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAAUV0AB5vcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXJ0ABFQYXJlbnRSdW5uZXIuamF2YXQAB3J1bkxlYWZzcQB+ACVzcQB+ACgBdAAOanVuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAAE50AChvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNzUnVubmVydAAbQmxvY2tKVW5pdDRDbGFzc1J1bm5lci5qYXZhdAAIcnVuQ2hpbGRzcQB+ACVzcQB+ACgBdAAOanVuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAADlxAH4AbXEAfgBucQB+AG9zcQB+ACVzcQB+ACgBdAAOanVuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAASJ0ACBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkM3EAfgBncQB+AFRzcQB+ACVzcQB+ACgBdAAOanVuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAAEd0ACBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkMXEAfgBndAAIc2NoZWR1bGVzcQB+ACVzcQB+ACgBdAAOanVuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAASBxAH4AZnEAfgBndAALcnVuQ2hpbGRyZW5zcQB+ACVzcQB+ACgBdAAOan
 VuaXQtNC4xMi5qYXJxAH4ASXNxAH4ALAAAADpxAH4AZnEAfgBndAAKYWNjZXNzJDAwMHNxAH4AJXNxAH4AKAF0AA5qdW5pdC00LjEyLmphcnEAfgBJc3EAfgAsAAABDHQAIG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQycQB+AGdxAH4AYXNxAH4AJXNxAH4AKAF0AA5qdW5pdC00LjEyLmphcnEAfgBJc3EAfgAsAAAAGnQAMG9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuUnVuQmVmb3Jlc3QAD1J1bkJlZm9yZXMuamF2YXEAfgBhc3EAfgAlc3EAfgAoAXQADmp1bml0LTQuMTIuamFycQB+AElzcQB+ACwAAAAbdAAvb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5SdW5BZnRlcnN0AA5SdW5BZnRlcnMuamF2YXEAfgBhc3EAfgAlc3EAfgAoAXQADmp1bml0LTQuMTIuamFycQB+AElzcQB+ACwAAAFrcQB+AGZxAH4AZ3EAfgBUc3EAfgAlc3EAfgAoAXQADmp1bml0LTQuMTIuamFycQB+AElzcQB+ACwAAACJdAAab3JnLmp1bml0LnJ1bm5lci5KVW5pdENvcmV0AA5KVW5pdENvcmUuamF2YXEAfgBUc3EAfgAlc3EAfgAoAXQADGp1bml0LXJ0LmphcnEAfgArc3EAfgAsAAAAdXQAKGNvbS5pbnRlbGxpai5qdW5pdDQuSlVuaXQ0SWRlYVRlc3RSdW5uZXJ0ABlKVW5pdDRJZGVhVGVzdFJ1bm5lci5qYXZhdAATc3RhcnRSdW5uZXJXaXRoQXJnc3NxAH4AJXNxAH4AKAF0AAxqdW5pdC1ydC5qYXJxAH4AK3NxAH4ALAAAACpxAH4AqHEAfgCpcQB+AKpzcQB+ACVzcQB+ACgBdAAManVuaXQ
 tcnQuamFycQB+ACtzcQB+ACwAAAEGdAAsY29tLmludGVsbGlqLnJ0LmV4ZWN1dGlvbi5qdW5pdC5KVW5pdFN0YXJ0ZXJ0ABFKVW5pdFN0YXJ0ZXIuamF2YXQAFnByZXBhcmVTdHJlYW1zQW5kU3RhcnRzcQB+ACVzcQB+ACgBdAAManVuaXQtcnQuamFycQB+ACtzcQB+ACwAAABUcQB+ALNxAH4AtHQABG1haW5zcQB+ACVzcQB+ACgAcQB+ACtxAH4AM3NxAH4ALP////5xAH4ANXEAfgA2cQB+ADdzcQB+ACVzcQB+ACgAcQB+ACtxAH4AM3NxAH4ALAAAADlxAH4ANXEAfgA2cQB+ADtzcQB+ACVzcQB+ACgAcQB+ACtxAH4AM3NxAH4ALAAAACtxAH4AP3EAfgBAcQB+ADtzcQB+ACVzcQB+ACgAcQB+ACtxAH4AM3NxAH4ALAAAAl5xAH4ARHEAfgBFcQB+ADtzcQB+ACVzcQB+ACgBdAALaWRlYV9ydC5qYXJxAH4AK3NxAH4ALAAAAJN0AC1jb20uaW50ZWxsaWoucnQuZXhlY3V0aW9uLmFwcGxpY2F0aW9uLkFwcE1haW50AAxBcHBNYWluLmphdmFxAH4AunQAFk9NRyBJJ3ZlIGJlZW4gZGVsZXRlZCFxAH4AzXQARW9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuTG9nNGpMb2dFdmVudFRlc3QkRGVsZXRlZEV4Y2VwdGlvbnVyADRbTG9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmltcGwuVGhyb3dhYmxlUHJveHk7+u0B4IWi6zkCAAB4cAAAAAB4";
 
         final byte[] binaryDecoded = DatatypeConverter.parseBase64Binary(base64);
         final Log4jLogEvent evt2 = deserialize(binaryDecoded);
@@ -521,7 +521,7 @@ public class Log4jLogEventTest {
         assertNotEquals(reason, other, event);
         assertNotEquals(reason + " hashCode", other.hashCode(), event.hashCode());
     }
-    
+
     @Test
     public void testToString() {
         // Throws an NPE in 2.6.2

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c35ac444/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f2b9fa5..f86ae32 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-1226" dev="rpopma" type="fix">
+        Improve LogEvent serialization to handle non-serializable Messages and deserializing when required classes are missing.
+      </action>
       <action issue="LOG4J2-1663" dev="rpopma" type="fix">
         Ensure SortedArrayStringMap can be serialized and deserialized without errors regardless of content.
       </action>