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/22 12:58:16 UTC
[05/14] 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/master
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;