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/04/10 10:30:41 UTC

[1/8] logging-log4j2 git commit: GC free GelfLayout

Repository: logging-log4j2
Updated Branches:
  refs/heads/master b69cbbc29 -> 880a78029


GC free GelfLayout


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

Branch: refs/heads/master
Commit: dce9b623db47e34b0ce41718fdcecbb74b981434
Parents: e1b3f4c
Author: Mikael Ståldal <mi...@magine.com>
Authored: Tue Apr 5 13:58:14 2016 +0200
Committer: Mikael Ståldal <mi...@magine.com>
Committed: Tue Apr 5 13:58:14 2016 +0200

----------------------------------------------------------------------
 .../logging/log4j/core/layout/GelfLayout.java   | 67 +++++++++++++++-----
 log4j-core/src/test/resources/gcFreeLogging.xml |  4 +-
 pom.xml                                         |  6 +-
 3 files changed, 55 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/dce9b623/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 084eae8..424cfff 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -28,7 +28,9 @@ import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.net.Severity;
 import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.KeyValuePair;
+import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.Strings;
 
 import java.io.*;
@@ -135,7 +137,7 @@ public final class GelfLayout extends AbstractStringLayout {
 
     @Override
     public byte[] toByteArray(final LogEvent event) {
-        StringBuilder text = toText(event, getStringBuilder());
+        StringBuilder text = toText(event, getStringBuilder(), false);
         final byte[] bytes = getBytes(text.toString());
         return compressionType != CompressionType.OFF && bytes.length > compressionThreshold ? compress(bytes) : bytes;
     }
@@ -146,7 +148,7 @@ public final class GelfLayout extends AbstractStringLayout {
             super.encode(event, destination);
             return;
         }
-        final StringBuilder text = toText(event, getStringBuilder());
+        final StringBuilder text = toText(event, getStringBuilder(), true);
         final TextEncoderHelper helper = getCachedTextEncoderHelper();
         helper.encodeText(text, destination);
     }
@@ -170,44 +172,77 @@ public final class GelfLayout extends AbstractStringLayout {
 
     @Override
     public String toSerializable(final LogEvent event) {
-        final StringBuilder text = toText(event, getStringBuilder());
+        final StringBuilder text = toText(event, getStringBuilder(), false);
         return text.toString();
     }
 
-    private StringBuilder toText(LogEvent event, StringBuilder builder) {
+    private StringBuilder toText(LogEvent event, StringBuilder builder, boolean gcFree) {
         final JsonStringEncoder jsonEncoder = JsonStringEncoder.getInstance();
         builder.append('{');
         builder.append("\"version\":\"1.1\",");
-        builder.append("\"host\":\"").append(jsonEncoder.quoteAsString(toNullSafeString(host))).append(QC);
+        builder.append("\"host\":\"");
+        jsonEncoder.quoteAsString(toNullSafeString(host), builder);
+        builder.append(QC);
         builder.append("\"timestamp\":").append(formatTimestamp(event.getTimeMillis())).append(C);
         builder.append("\"level\":").append(formatLevel(event.getLevel())).append(C);
         if (event.getThreadName() != null) {
-            builder.append("\"_thread\":\"").append(jsonEncoder.quoteAsString(event.getThreadName())).append(QC);
+            builder.append("\"_thread\":\"");
+            jsonEncoder.quoteAsString(event.getThreadName(), builder);
+            builder.append(QC);
         }
         if (event.getLoggerName() != null) {
-            builder.append("\"_logger\":\"").append(jsonEncoder.quoteAsString(event.getLoggerName())).append(QC);
+            builder.append("\"_logger\":\"");
+            jsonEncoder.quoteAsString(event.getLoggerName(), builder);
+            builder.append(QC);
         }
 
         for (final KeyValuePair additionalField : additionalFields) {
-            builder.append(QU).append(jsonEncoder.quoteAsString(additionalField.getKey())).append("\":\"")
-                    .append(jsonEncoder.quoteAsString(toNullSafeString(additionalField.getValue()))).append(QC);
+            builder.append(QU);
+            jsonEncoder.quoteAsString(additionalField.getKey(), builder);
+            builder.append("\":\"");
+            jsonEncoder.quoteAsString(toNullSafeString(additionalField.getValue()), builder);
+            builder.append(QC);
         }
         for (final Map.Entry<String, String> entry : event.getContextMap().entrySet()) {
-            builder.append(QU).append(jsonEncoder.quoteAsString(entry.getKey())).append("\":\"")
-                    .append(jsonEncoder.quoteAsString(toNullSafeString(entry.getValue()))).append(QC);
+            builder.append(QU);
+            jsonEncoder.quoteAsString(entry.getKey(), builder);
+            builder.append("\":\"");
+            jsonEncoder.quoteAsString(toNullSafeString(entry.getValue()), builder);
+            builder.append(QC);
         }
         if (event.getThrown() != null) {
-            builder.append("\"full_message\":\"").append(jsonEncoder.quoteAsString(formatThrowable(event.getThrown())))
-                    .append(QC);
+            builder.append("\"full_message\":\"");
+            jsonEncoder.quoteAsString(formatThrowable(event.getThrown()), builder);
+            builder.append(QC);
         }
 
-        builder.append("\"short_message\":\"").append(jsonEncoder.quoteAsString(toNullSafeString(event.getMessage().getFormattedMessage())))
-                .append(Q);
+        builder.append("\"short_message\":\"");
+        Message message = event.getMessage();
+        if (gcFree && message instanceof StringBuilderFormattable) {
+            StringBuilder messageBuffer = getMessageStringBuilder();
+            ((StringBuilderFormattable)message).formatTo(messageBuffer);
+            jsonEncoder.quoteAsString(messageBuffer, builder);
+        } else {
+            jsonEncoder.quoteAsString(toNullSafeString(message.getFormattedMessage()), builder);
+        }
+        builder.append(Q);
         builder.append('}');
         return builder;
     }
 
-    private String toNullSafeString(final String s) {
+    private static final ThreadLocal<StringBuilder> messageStringBuilder = new ThreadLocal<>();
+
+    private static StringBuilder getMessageStringBuilder() {
+        StringBuilder result = messageStringBuilder.get();
+        if (result == null) {
+            result = new StringBuilder(DEFAULT_STRING_BUILDER_SIZE);
+            messageStringBuilder.set(result);
+        }
+        result.setLength(0);
+        return result;
+    }
+
+    private CharSequence toNullSafeString(final CharSequence s) {
         return s == null ? Strings.EMPTY : s;
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/dce9b623/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 560c83c..6cf9066 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -6,16 +6,14 @@
         <Pattern>%d %p %c{1.} [%t] %X{aKey} %m %ex%n</Pattern>
       </PatternLayout>
     </RandomAccessFile>
-<!--
     <RandomAccessFile name="RandomAccessFileGelf" fileName="gcfree.json" immediateFlush="false" append="false">
       <GelfLayout compressionType="OFF"/>
     </RandomAccessFile>
--->
   </Appenders>
   <Loggers>
     <Root level="info" includeLocation="false">
       <appender-ref ref="RandomAccessFilePattern"/>
-      <!-- <appender-ref ref="RandomAccessFileGelf"/> -->
+      <appender-ref ref="RandomAccessFileGelf"/>
     </Root>
   </Loggers>
 </Configuration>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/dce9b623/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index b404f29..343bc29 100644
--- a/pom.xml
+++ b/pom.xml
@@ -190,7 +190,7 @@
     <slf4jVersion>1.7.13</slf4jVersion>
     <logbackVersion>1.1.3</logbackVersion>
     <jackson1Version>1.9.13</jackson1Version>
-    <jackson2Version>2.7.3</jackson2Version>
+    <jackson2Version>2.8.0-SNAPSHOT</jackson2Version>
     <springVersion>3.2.13.RELEASE</springVersion>
     <flumeVersion>1.6.0</flumeVersion>
     <disruptorVersion>3.3.4</disruptorVersion>
@@ -542,13 +542,13 @@
       <dependency>
         <groupId>com.fasterxml.jackson.dataformat</groupId>
         <artifactId>jackson-dataformat-yaml</artifactId>
-        <version>${jackson2Version}</version>
+        <version>2.7.3</version>
         <optional>true</optional>
       </dependency>
       <dependency>
         <groupId>com.fasterxml.jackson.dataformat</groupId>
         <artifactId>jackson-dataformat-xml</artifactId>
-        <version>${jackson2Version}</version>
+        <version>2.7.3</version>
         <optional>true</optional>
       </dependency>
       <dependency>


[3/8] logging-log4j2 git commit: Merge branch 'master' into LOG4J2-1356

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

Conflicts:
	log4j-core/src/test/resources/gcFreeLogging.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/8dc5bd46
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/8dc5bd46
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/8dc5bd46

Branch: refs/heads/master
Commit: 8dc5bd46fb1752e51043e33586e3a8f7f61fc235
Parents: 05e58c6 4d1d60d
Author: Mikael Ståldal <mi...@magine.com>
Authored: Fri Apr 8 12:01:25 2016 +0200
Committer: Mikael Ståldal <mi...@magine.com>
Committed: Fri Apr 8 12:01:25 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/logging/log4j/Logger.java   | 244 +++++++++++++++
 .../logging/log4j/message/MessageFactory2.java  |   7 +
 .../log4j/message/ReusableMessageFactory.java   |   7 +
 .../log4j/message/ReusableSimpleMessage.java    |  16 +-
 .../logging/log4j/message/SimpleMessage.java    |  39 ++-
 .../logging/log4j/simple/SimpleLogger.java      |   5 +
 .../logging/log4j/spi/AbstractLogger.java       | 155 +++++++++
 .../logging/log4j/spi/ExtendedLogger.java       |  23 ++
 .../log4j/spi/ExtendedLoggerWrapper.java        |  14 +
 .../log4j/spi/MessageFactory2Adapter.java       |   6 +
 .../logging/log4j/status/StatusLogger.java      |   5 +
 .../logging/log4j/AbstractLoggerTest.java       | 159 ++++++++++
 .../apache/logging/log4j/LambdaLoggerTest.java  |   5 +
 .../org/apache/logging/log4j/TestLogger.java    |   5 +
 .../message/ReusableSimpleMessageTest.java      |   8 +-
 log4j-core/pom.xml                              |   8 +-
 .../org/apache/logging/log4j/core/Logger.java   |  16 +
 .../appender/AbstractOutputStreamAppender.java  |  50 ++-
 .../log4j/core/appender/FileManager.java        |  33 +-
 .../core/appender/MemoryMappedFileAppender.java |   6 +-
 .../core/appender/MemoryMappedFileManager.java  |  57 +++-
 .../core/appender/OutputStreamManager.java      |  51 +++
 .../OutputStreamManagerDestination.java         |  59 ++++
 .../core/appender/RandomAccessFileAppender.java |  13 +-
 .../core/appender/RandomAccessFileManager.java  |  44 ++-
 .../RollingRandomAccessFileAppender.java        |  13 +-
 .../log4j/core/appender/SocketAppender.java     |  21 +-
 .../appender/rolling/RollingFileManager.java    |  14 +-
 .../rolling/RollingRandomAccessFileManager.java |  59 +++-
 .../core/jackson/Log4jJsonObjectMapper.java     |   2 +-
 .../core/jackson/Log4jXmlObjectMapper.java      |   2 +-
 .../logging/log4j/core/util/Constants.java      |  18 +-
 .../logging/log4j/core/util/WatchManager.java   |   6 +-
 .../logging/log4j/MarkerMixInJsonTest.java      |  31 ++
 .../apache/logging/log4j/MarkerMixInTest.java   |   8 +-
 .../logging/log4j/MarkerMixInXmlTest.java       |  31 ++
 .../logging/log4j/core/GcFreeLoggingTest.java   |  40 ++-
 .../MemoryMappedFileAppenderLocationTest.java   |  14 +-
 .../appender/MemoryMappedFileManagerTest.java   |   4 +-
 .../appender/RandomAccessFileManagerTest.java   |  15 +-
 .../RollingRandomAccessFileManagerTest.java     |   6 +-
 .../log4j/core/impl/Log4jLogEventTest.java      |  39 +--
 .../log4j/core/impl/ThrowableProxyTest.java     |  15 +-
 .../log4j/core/jackson/LevelMixInJsonTest.java  |  28 ++
 .../log4j/core/jackson/LevelMixInTest.java      |   9 +-
 .../log4j/core/jackson/LevelMixInXmlTest.java   |  32 ++
 .../org/apache/logging/slf4j/SLF4JLogger.java   |   5 +
 pom.xml                                         |   2 +-
 src/changes/changes.xml                         |  15 +
 src/site/site.xml                               |  19 +-
 src/site/xdoc/manual/garbagefree.xml            | 118 +++++--
 src/site/xdoc/manual/thread-context.xml         | 311 ++++++++++---------
 52 files changed, 1581 insertions(+), 331 deletions(-)
----------------------------------------------------------------------


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

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8dc5bd46/src/site/xdoc/manual/garbagefree.xml
----------------------------------------------------------------------
diff --cc src/site/xdoc/manual/garbagefree.xml
index 074f0d0,2338d1e..60471f5
--- a/src/site/xdoc/manual/garbagefree.xml
+++ b/src/site/xdoc/manual/garbagefree.xml
@@@ -234,11 -276,28 +281,32 @@@
              </ul>
  
            </td></tr></table>
 +
 +          <h5>GelfLayout</h5>
 +          <p>GelfLayout is garbage-free when used with compressionType="OFF".</p>
 +
          </subsubsection>
+         <a name="api" />
+         <subsubsection name="API Changes">
+           <h4>API Changes</h4>
+           <p>
+             Methods have been added to the <tt>Logger</tt> interface so that no vararg array objects are created
+             when logging messages with up to ten parameters.
+           </p>
+           <p>
+             Also, methods have been added to the <tt>Logger</tt> interface to log <tt>CharSequence</tt> messages.
+             User-defined objects that implement the <tt>CharSequence</tt> interface can be logged without creating
+             temporary objects: Log4j will try to turn CharSequence messages,
+             Object messages and message parameters
+             into text by appending them to a StringBuilder as a CharSequence.
+             This avoids calling <tt>toString()</tt> on these objects.
+           </p>
+           <p>
+             (Note that Log4j may call <tt>toString()</tt> on message and parameter objects when
+             garbage-free logging is disabled
+             because system property <tt>log4j2.enable.threadlocals</tt> is set to "false".)
+           </p>
+         </subsubsection>
          <a name="codeImpact" />
          <subsubsection name="Impact on Application Code: Autoboxing">
          <h4>Impact on Application Code: Autoboxing</h4>


[2/8] logging-log4j2 git commit: Update documentation

Posted by mi...@apache.org.
Update documentation


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

Branch: refs/heads/master
Commit: 05e58c6ee4aa4ee9259291a8bb723b79bd0a466d
Parents: dce9b62
Author: Mikael Ståldal <mi...@magine.com>
Authored: Tue Apr 5 14:03:22 2016 +0200
Committer: Mikael Ståldal <mi...@magine.com>
Committed: Tue Apr 5 14:03:22 2016 +0200

----------------------------------------------------------------------
 src/site/xdoc/manual/garbagefree.xml | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/05e58c6e/src/site/xdoc/manual/garbagefree.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/garbagefree.xml b/src/site/xdoc/manual/garbagefree.xml
index 7154f38..074f0d0 100644
--- a/src/site/xdoc/manual/garbagefree.xml
+++ b/src/site/xdoc/manual/garbagefree.xml
@@ -102,9 +102,14 @@
         <a name="Layouts" />
         <subsubsection name="Supported Layouts">
           <h4>Supported Layouts</h4>
+
+          <p>
+            <em>Note:</em>Logging Exceptions and stack traces will create temporary objects with any layout.
+          </p>
+
+          <h5>PatternLayout</h5>
           <p>
-            From the built-in <a href="layouts.html">layouts</a>, currently only PatternLayout
-             with the following limited set of conversion patterns is garbage-free.
+            PatternLayout with the following limited set of conversion patterns is garbage-free.
             Format modifiers to control such things as field width, padding, left and right justification will not
             generate garbage.
           </p>
@@ -211,9 +216,6 @@
             </tr>
           </table>
           <p>
-            Logging Exceptions and stack traces will create temporary objects.
-          </p>
-          <p>
             Other PatternLayout conversion patterns, and other Layouts may be updated
             to avoid creating temporary objects in future releases. (Patches welcome!)
           </p>
@@ -232,6 +234,10 @@
             </ul>
 
           </td></tr></table>
+
+          <h5>GelfLayout</h5>
+          <p>GelfLayout is garbage-free when used with compressionType="OFF".</p>
+
         </subsubsection>
         <a name="codeImpact" />
         <subsubsection name="Impact on Application Code: Autoboxing">


[4/8] logging-log4j2 git commit: Use custom JSON string encoding

Posted by mi...@apache.org.
Use custom JSON string encoding


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

Branch: refs/heads/master
Commit: 838f14c5b5ec6acc2c95c900cb8122695471cbe3
Parents: 8dc5bd4
Author: Mikael Ståldal <mi...@magine.com>
Authored: Fri Apr 8 14:03:43 2016 +0200
Committer: Mikael Ståldal <mi...@magine.com>
Committed: Fri Apr 8 14:03:43 2016 +0200

----------------------------------------------------------------------
 .../logging/log4j/core/layout/GelfLayout.java   | 23 +++--
 .../logging/log4j/core/util/JsonUtils.java      | 93 ++++++++++++++++++++
 pom.xml                                         |  6 +-
 3 files changed, 107 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/838f14c5/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 424cfff..8dae8c3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -16,7 +16,6 @@
  */
 package org.apache.logging.log4j.core.layout;
 
-import com.fasterxml.jackson.core.io.JsonStringEncoder;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
@@ -27,6 +26,7 @@ import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.net.Severity;
 import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.core.util.JsonUtils;
 import org.apache.logging.log4j.core.util.KeyValuePair;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.status.StatusLogger;
@@ -177,42 +177,41 @@ public final class GelfLayout extends AbstractStringLayout {
     }
 
     private StringBuilder toText(LogEvent event, StringBuilder builder, boolean gcFree) {
-        final JsonStringEncoder jsonEncoder = JsonStringEncoder.getInstance();
         builder.append('{');
         builder.append("\"version\":\"1.1\",");
         builder.append("\"host\":\"");
-        jsonEncoder.quoteAsString(toNullSafeString(host), builder);
+        JsonUtils.quoteAsString(toNullSafeString(host), builder);
         builder.append(QC);
         builder.append("\"timestamp\":").append(formatTimestamp(event.getTimeMillis())).append(C);
         builder.append("\"level\":").append(formatLevel(event.getLevel())).append(C);
         if (event.getThreadName() != null) {
             builder.append("\"_thread\":\"");
-            jsonEncoder.quoteAsString(event.getThreadName(), builder);
+            JsonUtils.quoteAsString(event.getThreadName(), builder);
             builder.append(QC);
         }
         if (event.getLoggerName() != null) {
             builder.append("\"_logger\":\"");
-            jsonEncoder.quoteAsString(event.getLoggerName(), builder);
+            JsonUtils.quoteAsString(event.getLoggerName(), builder);
             builder.append(QC);
         }
 
         for (final KeyValuePair additionalField : additionalFields) {
             builder.append(QU);
-            jsonEncoder.quoteAsString(additionalField.getKey(), builder);
+            JsonUtils.quoteAsString(additionalField.getKey(), builder);
             builder.append("\":\"");
-            jsonEncoder.quoteAsString(toNullSafeString(additionalField.getValue()), builder);
+            JsonUtils.quoteAsString(toNullSafeString(additionalField.getValue()), builder);
             builder.append(QC);
         }
         for (final Map.Entry<String, String> entry : event.getContextMap().entrySet()) {
             builder.append(QU);
-            jsonEncoder.quoteAsString(entry.getKey(), builder);
+            JsonUtils.quoteAsString(entry.getKey(), builder);
             builder.append("\":\"");
-            jsonEncoder.quoteAsString(toNullSafeString(entry.getValue()), builder);
+            JsonUtils.quoteAsString(toNullSafeString(entry.getValue()), builder);
             builder.append(QC);
         }
         if (event.getThrown() != null) {
             builder.append("\"full_message\":\"");
-            jsonEncoder.quoteAsString(formatThrowable(event.getThrown()), builder);
+            JsonUtils.quoteAsString(formatThrowable(event.getThrown()), builder);
             builder.append(QC);
         }
 
@@ -221,9 +220,9 @@ public final class GelfLayout extends AbstractStringLayout {
         if (gcFree && message instanceof StringBuilderFormattable) {
             StringBuilder messageBuffer = getMessageStringBuilder();
             ((StringBuilderFormattable)message).formatTo(messageBuffer);
-            jsonEncoder.quoteAsString(messageBuffer, builder);
+            JsonUtils.quoteAsString(messageBuffer, builder);
         } else {
-            jsonEncoder.quoteAsString(toNullSafeString(message.getFormattedMessage()), builder);
+            JsonUtils.quoteAsString(toNullSafeString(message.getFormattedMessage()), builder);
         }
         builder.append(Q);
         builder.append('}');

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/838f14c5/log4j-core/src/main/java/org/apache/logging/log4j/core/util/JsonUtils.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/JsonUtils.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/JsonUtils.java
new file mode 100644
index 0000000..bca5417
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/JsonUtils.java
@@ -0,0 +1,93 @@
+/*
+ * 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.util;
+
+import com.fasterxml.jackson.core.io.CharTypes;
+
+/**
+ * This class is borrowed from <a href="https://github.com/FasterXML/jackson-core">Jackson</a>.
+ */
+public final class JsonUtils {
+
+    private final static char[] HC = CharTypes.copyHexChars();
+
+    /**
+     * Temporary buffer used for composing quote/escape sequences
+     */
+    private final static ThreadLocal<char[]> _qbufLocal = new ThreadLocal<>();
+
+    private static char[] getQBuf() {
+        char[] _qbuf = _qbufLocal.get();
+        if (_qbuf == null) {
+            _qbuf = new char[6];
+            _qbuf[0] = '\\';
+            _qbuf[2] = '0';
+            _qbuf[3] = '0';
+
+            _qbufLocal.set(_qbuf);
+        }
+        return _qbuf;
+    }
+
+    /**
+     * Quote text contents using JSON standard quoting, and append results to a supplied {@link StringBuilder}.
+     */
+    public static void quoteAsString(CharSequence input, StringBuilder output) {
+        final char[] qbuf = getQBuf();
+        final int[] escCodes = CharTypes.get7BitOutputEscapes();
+        final int escCodeCount = escCodes.length;
+        int inPtr = 0;
+        final int inputLen = input.length();
+
+        outer:
+        while (inPtr < inputLen) {
+            tight_loop:
+            while (true) {
+                char c = input.charAt(inPtr);
+                if (c < escCodeCount && escCodes[c] != 0) {
+                    break tight_loop;
+                }
+                output.append(c);
+                if (++inPtr >= inputLen) {
+                    break outer;
+                }
+            }
+            // something to escape; 2 or 6-char variant?
+            char d = input.charAt(inPtr++);
+            int escCode = escCodes[d];
+            int length = (escCode < 0)
+                    ? _appendNumeric(d, qbuf)
+                    : _appendNamed(escCode, qbuf);
+
+            output.append(qbuf, 0, length);
+        }
+    }
+
+    private static int _appendNumeric(int value, char[] qbuf) {
+        qbuf[1] = 'u';
+        // We know it's a control char, so only the last 2 chars are non-0
+        qbuf[4] = HC[value >> 4];
+        qbuf[5] = HC[value & 0xF];
+        return 6;
+    }
+
+    private static int _appendNamed(int esc, char[] qbuf) {
+        qbuf[1] = (char) esc;
+        return 2;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/838f14c5/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 1f42907..c0e54d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -190,7 +190,7 @@
     <slf4jVersion>1.7.13</slf4jVersion>
     <logbackVersion>1.1.3</logbackVersion>
     <jackson1Version>1.9.13</jackson1Version>
-    <jackson2Version>2.8.0-SNAPSHOT</jackson2Version>
+    <jackson2Version>2.7.3</jackson2Version>
     <springVersion>3.2.13.RELEASE</springVersion>
     <flumeVersion>1.6.0</flumeVersion>
     <disruptorVersion>3.3.4</disruptorVersion>
@@ -542,13 +542,13 @@
       <dependency>
         <groupId>com.fasterxml.jackson.dataformat</groupId>
         <artifactId>jackson-dataformat-yaml</artifactId>
-        <version>2.7.3</version>
+        <version>${jackson2Version}</version>
         <optional>true</optional>
       </dependency>
       <dependency>
         <groupId>com.fasterxml.jackson.dataformat</groupId>
         <artifactId>jackson-dataformat-xml</artifactId>
-        <version>2.7.3</version>
+        <version>${jackson2Version}</version>
         <optional>true</optional>
       </dependency>
       <dependency>


[5/8] logging-log4j2 git commit: Merge fix

Posted by mi...@apache.org.
Merge fix


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

Branch: refs/heads/master
Commit: 4009bcb0dc04d77dc32d44a1c92b9447c907ef12
Parents: 838f14c
Author: Mikael Ståldal <mi...@magine.com>
Authored: Fri Apr 8 14:08:12 2016 +0200
Committer: Mikael Ståldal <mi...@magine.com>
Committed: Fri Apr 8 14:08:12 2016 +0200

----------------------------------------------------------------------
 log4j-core/src/test/resources/gcFreeLogging.xml | 47 ++++++++++++++++++--
 1 file changed, 44 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4009bcb0/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 6cf9066..caf1dd7 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -1,18 +1,59 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Configuration status="OFF">
   <Appenders>
-    <RandomAccessFile name="RandomAccessFilePattern" fileName="gcfree.log" immediateFlush="false" append="false">
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%p %c{1.} [%t] %X{aKey} %m%ex%n" />
+    </Console>
+    <File name="File" fileName="target/gcfreefile.log" bufferedIO="false">
+      <PatternLayout>
+        <Pattern>%d %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 %p %c{1.} [%t] %m%n</Pattern>
+      </PatternLayout>
+      <Policies>
+        <SizeBasedTriggeringPolicy size="50M" />
+      </Policies>
+    </RollingFile>
+    <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAF.log" immediateFlush="false" append="false">
       <PatternLayout>
         <Pattern>%d %p %c{1.} [%t] %X{aKey} %m %ex%n</Pattern>
       </PatternLayout>
     </RandomAccessFile>
+    <RollingRandomAccessFile name="RollingRandomAccessFile"
+                             fileName="target/gcfreeRRAF.log"
+                             filePattern="target/afterRollover-%i.log" append="false"
+                             immediateFlush="false">
+      <PatternLayout>
+        <Pattern>%d %p %c{1.} [%t] %X{aKey} %m %location %ex%n</Pattern>
+      </PatternLayout>
+      <Policies>
+        <SizeBasedTriggeringPolicy size="50 M"/>
+      </Policies>
+    </RollingRandomAccessFile>
+    <MemoryMappedFile name="MemoryMappedFile"
+                      fileName="target/gcfreemmap.log"
+                      immediateFlush="false" append="false">
+      <PatternLayout>
+        <Pattern>%d %p %c{1.} [%t] %X{aKey} %m%ex%n</Pattern>
+      </PatternLayout>
+    </MemoryMappedFile>
     <RandomAccessFile name="RandomAccessFileGelf" fileName="gcfree.json" immediateFlush="false" append="false">
-      <GelfLayout compressionType="OFF"/>
+       <GelfLayout compressionType="OFF"/>
     </RandomAccessFile>
   </Appenders>
   <Loggers>
     <Root level="info" includeLocation="false">
-      <appender-ref ref="RandomAccessFilePattern"/>
+      <appender-ref ref="Console" level="FATAL" />
+      <appender-ref ref="File"/>
+      <appender-ref ref="RandomAccessFile"/>
+      <appender-ref ref="RollingRandomAccessFile"/>
+      <appender-ref ref="File"/>
+      <appender-ref ref="RollingFile"/>
+      <appender-ref ref="MemoryMappedFile"/>
       <appender-ref ref="RandomAccessFileGelf"/>
     </Root>
   </Loggers>


[7/8] logging-log4j2 git commit: Merge branch 'master' into LOG4J2-1356

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


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

Branch: refs/heads/master
Commit: a91a54b955e89efee34fcaaa17bcab66edfc4b9c
Parents: 7c990c4 b69cbbc
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Apr 9 13:49:30 2016 +0200
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Apr 9 13:49:30 2016 +0200

----------------------------------------------------------------------
 .../appender/AbstractOutputStreamAppender.java  | 14 +++---
 .../core/appender/OutputStreamManager.java      |  5 ++-
 .../core/appender/RandomAccessFileManager.java  |  2 +-
 .../rolling/RollingRandomAccessFileManager.java |  2 +-
 .../log4j/core/layout/AbstractStringLayout.java | 47 ++++++++++----------
 .../log4j/core/layout/TextEncoderHelper.java    | 20 +++++----
 ...RandomAccessFileManagerHeaderFooterTest.java |  5 ++-
 7 files changed, 52 insertions(+), 43 deletions(-)
----------------------------------------------------------------------



[6/8] logging-log4j2 git commit: Merge fix 2

Posted by mi...@apache.org.
Merge fix 2


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

Branch: refs/heads/master
Commit: 7c990c4a0b8dd0ffcb4adfe7e19cb9ac39288bbf
Parents: 4009bcb
Author: Mikael Ståldal <mi...@magine.com>
Authored: Fri Apr 8 14:10:39 2016 +0200
Committer: Mikael Ståldal <mi...@magine.com>
Committed: Fri Apr 8 14:10:39 2016 +0200

----------------------------------------------------------------------
 log4j-core/src/test/resources/gcFreeLogging.xml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7c990c4a/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 caf1dd7..f90d754 100644
--- a/log4j-core/src/test/resources/gcFreeLogging.xml
+++ b/log4j-core/src/test/resources/gcFreeLogging.xml
@@ -10,7 +10,7 @@
       </PatternLayout>
     </File>
     <RollingFile name="RollingFile" fileName="target/gcfreeRollingFile.log"
-                 filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
+        filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz">
       <PatternLayout>
         <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
       </PatternLayout>
@@ -24,9 +24,9 @@
       </PatternLayout>
     </RandomAccessFile>
     <RollingRandomAccessFile name="RollingRandomAccessFile"
-                             fileName="target/gcfreeRRAF.log"
-                             filePattern="target/afterRollover-%i.log" append="false"
-                             immediateFlush="false">
+        fileName="target/gcfreeRRAF.log"
+        filePattern="target/afterRollover-%i.log" append="false"
+        immediateFlush="false">
       <PatternLayout>
         <Pattern>%d %p %c{1.} [%t] %X{aKey} %m %location %ex%n</Pattern>
       </PatternLayout>
@@ -35,13 +35,13 @@
       </Policies>
     </RollingRandomAccessFile>
     <MemoryMappedFile name="MemoryMappedFile"
-                      fileName="target/gcfreemmap.log"
-                      immediateFlush="false" append="false">
+        fileName="target/gcfreemmap.log"
+        immediateFlush="false" append="false">
       <PatternLayout>
         <Pattern>%d %p %c{1.} [%t] %X{aKey} %m%ex%n</Pattern>
       </PatternLayout>
     </MemoryMappedFile>
-    <RandomAccessFile name="RandomAccessFileGelf" fileName="gcfree.json" immediateFlush="false" append="false">
+    <RandomAccessFile name="RandomAccessFileGelf" fileName="target/gcfree.json" immediateFlush="false" append="false">
        <GelfLayout compressionType="OFF"/>
     </RandomAccessFile>
   </Appenders>


[8/8] logging-log4j2 git commit: Use ENABLE_DIRECT_ENCODERS switch in GelfLayout

Posted by mi...@apache.org.
Use ENABLE_DIRECT_ENCODERS switch in GelfLayout


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

Branch: refs/heads/master
Commit: 880a7802991e9a71405085c025c247007268312b
Parents: a91a54b
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sun Apr 10 10:22:40 2016 +0200
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sun Apr 10 10:22:40 2016 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/logging/log4j/core/layout/GelfLayout.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/880a7802/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 8dae8c3..c378d9f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -144,7 +144,7 @@ public final class GelfLayout extends AbstractStringLayout {
 
     @Override
     public void encode(final LogEvent event, final ByteBufferDestination destination) {
-        if (!Constants.ENABLE_THREADLOCALS || compressionType != CompressionType.OFF) {
+        if (!Constants.ENABLE_DIRECT_ENCODERS || !Constants.ENABLE_THREADLOCALS || compressionType != CompressionType.OFF) {
             super.encode(event, destination);
             return;
         }