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/03/08 13:55:21 UTC

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

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/920cddd4
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/920cddd4
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/920cddd4

Branch: refs/heads/gelf-layout-gc-free
Commit: 920cddd42f0f97975019c5a2ac466256078d6db8
Parents: 3110269
Author: Mikael Ståldal <mi...@magine.com>
Authored: Tue Mar 8 13:55:00 2016 +0100
Committer: Mikael Ståldal <mi...@magine.com>
Committed: Tue Mar 8 13:55:00 2016 +0100

----------------------------------------------------------------------
 .../log4j/core/layout/AbstractStringLayout.java | 30 +++++++++++++++++++-
 .../logging/log4j/core/layout/GelfLayout.java   | 15 +++++++++-
 .../log4j/core/layout/PatternLayout.java        | 11 -------
 .../logging/log4j/core/util/StringEncoder.java  | 10 +++----
 4 files changed, 48 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/920cddd4/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
index 607d965..a31df97 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
@@ -17,6 +17,8 @@
 package org.apache.logging.log4j.core.layout;
 
 import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 
@@ -56,7 +58,9 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> implem
      */
     protected static final int DEFAULT_STRING_BUILDER_SIZE = 1024;
 
-    private final static ThreadLocal<StringBuilder> threadLocal = new ThreadLocal<>();
+    private static final ThreadLocal<StringBuilder> threadLocal = new ThreadLocal<>();
+
+    private static final ThreadLocal<TextEncoderHelper> textEncoderHelper = new ThreadLocal<>();
 
     /**
      * Returns a {@code StringBuilder} that this Layout implementation can use to write the formatted log event to.
@@ -72,6 +76,16 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> implem
         result.setLength(0);
         return result;
     }
+
+    protected TextEncoderHelper getCachedTextEncoderHelper() {
+        TextEncoderHelper result = textEncoderHelper.get();
+        if (result == null) {
+            result = new TextEncoderHelper(getCharset());
+            textEncoderHelper.set(result);
+        }
+        return result;
+    }
+
     // LOG4J2-1151: If the built-in JDK 8 encoders are available we should use them.
     private static boolean isPreJava8() {
         final String version = System.getProperty("java.version");
@@ -147,6 +161,20 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> implem
         }
     }
 
+    protected byte[] getBytes(final CharSequence cseq) {
+        if (useCustomEncoding) { // rely on branch prediction to eliminate this check if false
+            return StringEncoder.encodeSingleByteChars(cseq);
+        }
+        ByteBuffer byteBuffer = charset.encode(CharBuffer.wrap(cseq));
+        if (byteBuffer.hasArray()) {
+            return byteBuffer.array();
+        } else {
+            byte[] bytes = new byte[byteBuffer.remaining()];
+            byteBuffer.get(bytes);
+            return bytes;
+        }
+    }
+
     @Override
     public Charset getCharset() {
         return charset;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/920cddd4/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 f107eb2..de48431 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
@@ -37,6 +37,7 @@ import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 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.KeyValuePair;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
@@ -142,10 +143,22 @@ public final class GelfLayout extends AbstractStringLayout {
 
     @Override
     public byte[] toByteArray(final LogEvent event) {
-        final byte[] bytes = getBytes(toSerializable(event));
+        StringBuilder text = toText(event, getStringBuilder());
+        final byte[] bytes = getBytes(text);
         return compressionType != CompressionType.OFF && bytes.length > compressionThreshold ? compress(bytes) : bytes;
     }
 
+    @Override
+    public void encode(final LogEvent event, final ByteBufferDestination destination) {
+        if (!Constants.ENABLE_THREADLOCALS || compressionType != CompressionType.OFF) {
+            super.encode(event, destination);
+            return;
+        }
+        final StringBuilder text = toText(event, getStringBuilder());
+        final TextEncoderHelper helper = getCachedTextEncoderHelper();
+        helper.encodeText(text, destination);
+    }
+
     private byte[] compress(final byte[] bytes) {
         try {
             final ByteArrayOutputStream baos = new ByteArrayOutputStream(compressionThreshold / 8);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/920cddd4/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index ea0ec79..e35e358 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -77,8 +77,6 @@ public final class PatternLayout extends AbstractStringLayout {
     /** Key to identify pattern converters. */
     public static final String KEY = "Converter";
 
-    private static final ThreadLocal<TextEncoderHelper> textEncoderHelper = new ThreadLocal<>();
-
     /**
      * Conversion pattern.
      */
@@ -197,15 +195,6 @@ public final class PatternLayout extends AbstractStringLayout {
         return serializer.toSerializable(event, destination);
     }
 
-    private TextEncoderHelper getCachedTextEncoderHelper() {
-        TextEncoderHelper result = textEncoderHelper.get();
-        if (result == null) {
-            result = new TextEncoderHelper(getCharset());
-            textEncoderHelper.set(result);
-        }
-        return result;
-    }
-
     /**
      * Creates a PatternParser.
      * @param config The Configuration.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/920cddd4/log4j-core/src/main/java/org/apache/logging/log4j/core/util/StringEncoder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/StringEncoder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/StringEncoder.java
index 4f62208..a2011cb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/StringEncoder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/StringEncoder.java
@@ -53,13 +53,13 @@ public final class StringEncoder {
     }
 
     /**
-     * Encodes the specified string by casting each character to a byte.
+     * Encodes the specified char sequence by casting each character to a byte.
      *
-     * @param s the string to encode
+     * @param s the char sequence to encode
      * @return the encoded String
      * @see <a href="https://issues.apache.org/jira/browse/LOG4J2-1151">LOG4J2-1151</a>
      */
-    public static byte[] encodeSingleByteChars(String s) {
+    public static byte[] encodeSingleByteChars(CharSequence s) {
         final int length = s.length();
         final byte[] result = new byte[length];
         encodeString(s, 0, length, result);
@@ -71,7 +71,7 @@ public final class StringEncoder {
      * Implementation note: this is the fast path. If the char array contains only ISO-8859-1 characters, all the work
      * will be done here.
      */
-    public static int encodeIsoChars(String charArray, int charIndex, byte[] byteArray, int byteIndex, int length) {
+    public static int encodeIsoChars(CharSequence charArray, int charIndex, byte[] byteArray, int byteIndex, int length) {
         int i = 0;
         for (; i < length; i++) {
             char c = charArray.charAt(charIndex++);
@@ -84,7 +84,7 @@ public final class StringEncoder {
     }
 
     // LOG4J2-1151
-    public static int encodeString(String charArray, int charOffset, int charLength, byte[] byteArray) {
+    public static int encodeString(CharSequence charArray, int charOffset, int charLength, byte[] byteArray) {
         int byteOffset = 0;
         int length = Math.min(charLength, byteArray.length);
         int charDoneIndex = charOffset + length;