[LOG4J2-1502] CsvParameterLayout is inserting NUL character if data
starts with {, (, [ or "Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/f9a5d552 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f9a5d552 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f9a5d552 Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure Commit: f9a5d552a9040c50adcfdd46fc2aeff67281bd76 Parents: c85a63c Author: Gary Gregory <[email protected]> Authored: Mon Aug 29 12:41:49 2016 -0700 Committer: Gary Gregory <[email protected]> Committed: Mon Aug 29 12:41:49 2016 -0700 ---------------------------------------------------------------------- .../log4j/core/layout/AbstractCsvLayout.java | 10 ++-- .../CsvJsonParameterLayoutFileAppenderTest.java | 49 ++++++++++++++++---- src/changes/changes.xml | 3 ++ 3 files changed, 50 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f9a5d552/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java index 3d0d80c..ffa6ea6 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java @@ -38,13 +38,13 @@ public abstract class AbstractCsvLayout extends AbstractStringLayout { protected static CSVFormat createFormat(final String format, final Character delimiter, final Character escape, final Character quote, final QuoteMode quoteMode, final String nullString, final String recordSeparator) { CSVFormat csvFormat = CSVFormat.valueOf(format); - if (delimiter != null) { + if (isNotNul(delimiter)) { csvFormat = csvFormat.withDelimiter(delimiter); } - if (escape != null) { + if (isNotNul(escape)) { csvFormat = csvFormat.withEscape(escape); } - if (quote != null) { + if (isNotNul(quote)) { csvFormat = csvFormat.withQuote(quote); } if (quoteMode != null) { @@ -59,6 +59,10 @@ public abstract class AbstractCsvLayout extends AbstractStringLayout { return csvFormat; } + private static boolean isNotNul(final Character character) { + return character != null && character.charValue() != 0; + } + private final CSVFormat format; protected AbstractCsvLayout(final Configuration config, final Charset charset, final CSVFormat csvFormat, http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f9a5d552/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/CsvJsonParameterLayoutFileAppenderTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/CsvJsonParameterLayoutFileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/CsvJsonParameterLayoutFileAppenderTest.java index 27c9366..e4357b5 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/CsvJsonParameterLayoutFileAppenderTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/CsvJsonParameterLayoutFileAppenderTest.java @@ -26,13 +26,15 @@ import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.junit.LoggerContextRule; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.RuleChain; import com.google.common.io.Files; +/** + * Tests https://issues.apache.org/jira/browse/LOG4J2-1502 + */ public class CsvJsonParameterLayoutFileAppenderTest { private static final String FILE_PATH = "target/CsvJsonParameterLayoutFileAppenderTest.log"; @@ -42,7 +44,7 @@ public class CsvJsonParameterLayoutFileAppenderTest { @Rule public RuleChain rule = loggerContextRule.withCleanFilesRule(FILE_PATH); - public void testNoNulCharacters(final String message) throws IOException { + public void testNoNulCharacters(final String message, final String expected) throws IOException { @SuppressWarnings("resource") final LoggerContext loggerContext = loggerContextRule.getLoggerContext(); final Logger logger = loggerContext.getLogger("com.example"); @@ -63,24 +65,53 @@ public class CsvJsonParameterLayoutFileAppenderTest { Assert.assertEquals("File contains " + count0s + " 0x00 byte at indices " + sb, 0, count0s); final List<String> readLines = Files.readLines(file, Charset.defaultCharset()); final String actual = readLines.get(0); - Assert.assertTrue(actual, actual.contains(message)); + // Assert.assertTrue(actual, actual.contains(message)); + Assert.assertEquals(actual, expected, actual); Assert.assertEquals(1, readLines.size()); } @Test - public void testNoNulCharactersABC() throws IOException { - testNoNulCharacters("ABC"); + public void testNoNulCharactersDoubleQuote() throws IOException { + // TODO This does not seem right but there is no NULs. Check Apache Commons CSV. + testNoNulCharacters("\"", "\"\"\"\""); } @Test - @Ignore("https://issues.apache.org/jira/browse/LOG4J2-1502") public void testNoNulCharactersJson() throws IOException { - testNoNulCharacters("{\"id\":10,\"name\":\"Alice\"}"); + testNoNulCharacters("{\"id\":10,\"name\":\"Alice\"}", "\"{\"\"id\"\":10,\"\"name\"\":\"\"Alice\"\"}\""); + } + + @Test + public void testNoNulCharactersOneChar() throws IOException { + testNoNulCharacters("A", "A"); + } + + @Test + public void testNoNulCharactersOpenCurly() throws IOException { + // TODO Why is the char quoted? Check Apache Commons CSV. + testNoNulCharacters("{", "\"{\""); + } + + @Test + public void testNoNulCharactersOpenParen() throws IOException { + // TODO Why is the char quoted? Check Apache Commons CSV. + testNoNulCharacters("(", "\"(\""); + } + + @Test + public void testNoNulCharactersOpenSquare() throws IOException { + // TODO Why is the char quoted? Check Apache Commons CSV. + testNoNulCharacters("[", "\"[\""); + } + + @Test + public void testNoNulCharactersThreeChars() throws IOException { + testNoNulCharacters("ABC", "ABC"); } @Test - @Ignore("https://issues.apache.org/jira/browse/LOG4J2-1502") public void testNoNulCharactersXml() throws IOException { - testNoNulCharacters("<test attr1='val1' attr2=\"value2\">X</test>"); + testNoNulCharacters("<test attr1='val1' attr2=\"value2\">X</test>", + "\"<test attr1='val1' attr2=\"\"value2\"\">X</test>\""); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f9a5d552/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index b901033..10be4c8 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -99,6 +99,9 @@ <action issue="LOG4J2-1235" dev="ggregory" type="fix" due-to="Niranjan Rao, Sascha Scholz, Aleksey Zvolinsky"> org.apache.logging.log4j.core.appender.routing.IdlePurgePolicy not working correctly. </action> + <action issue="LOG4J2-1502" dev="ggregory" type="fix" due-to="Sumit Singhal"> + CsvParameterLayout is inserting NUL character if data starts with {, (, [ or " + </action> <action issue="LOG4J2-1181" dev="mikes" type="add"> Scala API. </action>
