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;
}