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 <[email protected]>
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

Reply via email to