You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2019/04/16 17:31:40 UTC
[logging-log4j2] branch master updated: Allow custom end-of-line
with JsonLayout (fix for LOG4J2-2337) (#265)
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/master by this push:
new ba4c4c5 Allow custom end-of-line with JsonLayout (fix for LOG4J2-2337) (#265)
ba4c4c5 is described below
commit ba4c4c52673b547dbf4be079b3aab3030ed2960e
Author: Patrice Ferrot <pf...@users.noreply.github.com>
AuthorDate: Tue Apr 16 19:31:34 2019 +0200
Allow custom end-of-line with JsonLayout (fix for LOG4J2-2337) (#265)
---
.../log4j/jackson/json/layout/JsonLayout.java | 8 +++----
.../log4j/jackson/json/layout/JsonLayoutTest.java | 28 +++++++++++++++-------
.../log4j/jackson/AbstractJacksonLayout.java | 22 ++++++++++++++++-
.../jackson/layout/AbstractJacksonLayout.java | 23 +++++++++++++++++-
src/site/asciidoc/manual/layouts.adoc | 4 ++++
5 files changed, 71 insertions(+), 14 deletions(-)
diff --git a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
index 3eb70c6..56e1c25 100644
--- a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
@@ -98,7 +98,7 @@ public final class JsonLayout extends AbstractJacksonLayout {
final String headerPattern = toStringOrNull(getHeader());
final String footerPattern = toStringOrNull(getFooter());
return new JsonLayout(getConfiguration(), isLocationInfo(), isProperties(), encodeThreadContextAsList,
- isComplete(), isCompact(), getEventEol(), headerPattern, footerPattern, getCharset(),
+ isComplete(), isCompact(), getEventEol(), getEndOfLine(), headerPattern, footerPattern, getCharset(),
isIncludeStacktrace(), isStacktraceAsString(), isIncludeNullDelimiter(),
getAdditionalFields(), getObjectMessageAsJsonObject());
}
@@ -166,7 +166,7 @@ public final class JsonLayout extends AbstractJacksonLayout {
* @return A JSON Layout.
*/
public static JsonLayout createDefaultLayout() {
- return new JsonLayout(new DefaultConfiguration(), false, false, false, false, false, false,
+ return new JsonLayout(new DefaultConfiguration(), false, false, false, false, false, false, null,
DEFAULT_HEADER, DEFAULT_FOOTER, StandardCharsets.UTF_8, true, false, false, null, false);
}
@@ -177,14 +177,14 @@ public final class JsonLayout extends AbstractJacksonLayout {
private JsonLayout(final Configuration config, final boolean locationInfo, final boolean properties,
final boolean encodeThreadContextAsList,
- final boolean complete, final boolean compact, final boolean eventEol,
+ final boolean complete, final boolean compact, final boolean eventEol, final String endOfLine,
final String headerPattern, final String footerPattern, final Charset charset,
final boolean includeStacktrace, final boolean stacktraceAsString,
final boolean includeNullDelimiter,
final KeyValuePair[] additionalFields, final boolean objectMessageAsJsonObject) {
super(config, new JsonJacksonFactory(encodeThreadContextAsList, includeStacktrace, stacktraceAsString, objectMessageAsJsonObject).newWriter(
locationInfo, properties, compact),
- charset, compact, complete, eventEol,
+ charset, compact, complete, eventEol, endOfLine,
PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(headerPattern).setDefaultPattern(DEFAULT_HEADER).build(),
PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(footerPattern).setDefaultPattern(DEFAULT_FOOTER).build(),
includeNullDelimiter,
diff --git a/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutTest.java
index d477d23..8083119 100644
--- a/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutTest.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutTest.java
@@ -200,7 +200,7 @@ public class JsonLayoutTest {
}
private void testAllFeatures(final boolean locationInfo, final boolean compact, final boolean eventEol,
- final boolean includeContext, final boolean contextMapAslist, final boolean includeStacktrace)
+ final String endOfLine, final boolean includeContext, final boolean contextMapAslist, final boolean includeStacktrace)
throws Exception {
final Log4jLogEvent expected = LogEventFixtures.createLogEvent();
// @formatter:off
@@ -211,14 +211,21 @@ public class JsonLayoutTest {
.setComplete(false)
.setCompact(compact)
.setEventEol(eventEol)
+ .setEndOfLine(endOfLine)
.setCharset(StandardCharsets.UTF_8)
.setIncludeStacktrace(includeStacktrace)
.build();
// @formatter:off
final String str = layout.toSerializable(expected);
this.toPropertySeparator(compact);
- // Just check for \n since \r might or might not be there.
- assertEquals(str, !compact || eventEol, str.contains("\n"));
+ if (endOfLine == null) {
+ // Just check for \n since \r might or might not be there.
+ assertEquals(str, !compact || eventEol, str.contains("\n"));
+ }
+ else {
+ assertEquals(str, !compact || eventEol, str.contains(endOfLine));
+ assertEquals(str, compact && eventEol, str.endsWith(endOfLine));
+ }
assertEquals(str, locationInfo, str.contains("source"));
assertEquals(str, includeContext, str.contains("contextMap"));
final Log4jLogEvent actual = new Log4jJsonObjectMapper(contextMapAslist, includeStacktrace, false, false).readValue(str, Log4jLogEvent.class);
@@ -332,7 +339,12 @@ public class JsonLayoutTest {
@Test
public void testExcludeStacktrace() throws Exception {
- this.testAllFeatures(false, false, false, false, false, false);
+ this.testAllFeatures(false, false, false, null, false, false, false);
+ }
+
+ @Test
+ public void testLocationOnCustomEndOfLine() throws Exception {
+ this.testAllFeatures(true, true, true, "CUSTOM_END_OF_LINE", true, false, true);
}
@Test
@@ -552,22 +564,22 @@ public class JsonLayoutTest {
@Test
public void testLocationOffCompactOffMdcOff() throws Exception {
- this.testAllFeatures(false, false, false, false, false, true);
+ this.testAllFeatures(false, false, false, null, false, false, true);
}
@Test
public void testLocationOnCompactOnEventEolOnMdcOn() throws Exception {
- this.testAllFeatures(true, true, true, true, false, true);
+ this.testAllFeatures(true, true, true, null, true, false, true);
}
@Test
public void testLocationOnCompactOnEventEolOnMdcOnMdcAsList() throws Exception {
- this.testAllFeatures(true, true, true, true, true, true);
+ this.testAllFeatures(true, true, true, null, true, true, true);
}
@Test
public void testLocationOnCompactOnMdcOn() throws Exception {
- this.testAllFeatures(true, true, false, true, false, true);
+ this.testAllFeatures(true, true, false, null, true, false, true);
}
@Test
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
index 1428966..2dd8bd2 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
@@ -43,6 +43,9 @@ public abstract class AbstractJacksonLayout extends AbstractStringLayout {
private boolean eventEol;
@PluginBuilderAttribute
+ private String endOfLine;
+
+ @PluginBuilderAttribute
private boolean compact;
@PluginBuilderAttribute
@@ -74,6 +77,10 @@ public abstract class AbstractJacksonLayout extends AbstractStringLayout {
return eventEol;
}
+ public String getEndOfLine() {
+ return endOfLine;
+ }
+
public boolean isCompact() {
return compact;
}
@@ -132,6 +139,11 @@ public abstract class AbstractJacksonLayout extends AbstractStringLayout {
return asBuilder();
}
+ public B setEndOfLine(final String endOfLine) {
+ this.endOfLine = endOfLine;
+ return asBuilder();
+ }
+
/**
* Whether to include NULL byte as delimiter after each event (optional, default to false).
*
@@ -262,11 +274,19 @@ public abstract class AbstractJacksonLayout extends AbstractStringLayout {
final boolean compact, final boolean complete, final boolean eventEol, final Serializer headerSerializer,
final Serializer footerSerializer, final boolean includeNullDelimiter,
final KeyValuePair[] additionalFields) {
+ this(config, objectWriter, charset, compact, complete, eventEol, null, headerSerializer, footerSerializer,
+ includeNullDelimiter, additionalFields);
+ }
+
+ protected AbstractJacksonLayout(final Configuration config, final ObjectWriter objectWriter, final Charset charset,
+ final boolean compact, final boolean complete, final boolean eventEol, final String endOfLine,
+ final Serializer headerSerializer, final Serializer footerSerializer, final boolean includeNullDelimiter,
+ final KeyValuePair[] additionalFields) {
super(config, charset, headerSerializer, footerSerializer);
this.objectWriter = objectWriter;
this.compact = compact;
this.complete = complete;
- this.eol = compact && !eventEol ? COMPACT_EOL : DEFAULT_EOL;
+ this.eol = endOfLine != null ? endOfLine : compact && !eventEol ? COMPACT_EOL : DEFAULT_EOL;
this.includeNullDelimiter = includeNullDelimiter;
this.additionalFields = prepareAdditionalFields(config, additionalFields);
}
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java
index 7739979..8e53c6b 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java
@@ -67,6 +67,9 @@ abstract class AbstractJacksonLayout extends AbstractStringLayout {
private boolean eventEol;
@PluginBuilderAttribute
+ private String endOfLine;
+
+ @PluginBuilderAttribute
private boolean compact;
@PluginBuilderAttribute
@@ -98,6 +101,10 @@ abstract class AbstractJacksonLayout extends AbstractStringLayout {
return eventEol;
}
+ public String getEndOfLine() {
+ return endOfLine;
+ }
+
public boolean isCompact() {
return compact;
}
@@ -156,6 +163,11 @@ abstract class AbstractJacksonLayout extends AbstractStringLayout {
return asBuilder();
}
+ public B setEndOfLine(final String endOfLine) {
+ this.endOfLine = endOfLine;
+ return asBuilder();
+ }
+
/**
* Whether to include NULL byte as delimiter after each event (optional, default to false).
*
@@ -287,11 +299,20 @@ abstract class AbstractJacksonLayout extends AbstractStringLayout {
final boolean compact, final boolean complete, final boolean eventEol, final Serializer headerSerializer,
final Serializer footerSerializer, final boolean includeNullDelimiter,
final KeyValuePair[] additionalFields) {
+ this(config, objectWriter, charset, compact, complete, eventEol, null,
+ headerSerializer, footerSerializer, includeNullDelimiter, additionalFields);
+ }
+
+
+ protected AbstractJacksonLayout(final Configuration config, final ObjectWriter objectWriter, final Charset charset,
+ final boolean compact, final boolean complete, final boolean eventEol, String endOfLine,
+ final Serializer headerSerializer, final Serializer footerSerializer, final boolean includeNullDelimiter,
+ final KeyValuePair[] additionalFields) {
super(config, charset, headerSerializer, footerSerializer);
this.objectWriter = objectWriter;
this.compact = compact;
this.complete = complete;
- this.eol = compact && !eventEol ? COMPACT_EOL : DEFAULT_EOL;
+ this.eol = endOfLine != null ? endOfLine : compact && !eventEol ? COMPACT_EOL : DEFAULT_EOL;
this.includeNullDelimiter = includeNullDelimiter;
this.additionalFields = prepareAdditionalFields(config, additionalFields);
}
diff --git a/src/site/asciidoc/manual/layouts.adoc b/src/site/asciidoc/manual/layouts.adoc
index 45bbfb5..316c67b 100644
--- a/src/site/asciidoc/manual/layouts.adoc
+++ b/src/site/asciidoc/manual/layouts.adoc
@@ -396,6 +396,10 @@ indentation. Defaults to false.
each record. Defaults to false. Use with eventEol=true and compact=true
to get one record per line.
+|endOfLine
+|String
+|If set, overrides the default end-of-line string. E.g. set it to "\n" and use with eventEol=true and compact=true to have one record per line separated by "\n" instead of "\r\n". Defaults to null (i.e. not set).
+
|complete
|boolean
|If true, the appender includes the JSON header and