diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java index 50bff2beac7..466e5ba4b1a 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java @@ -29,11 +29,14 @@ import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.impl.Log4jLogEvent; import org.apache.logging.log4j.core.test.appender.ListAppender; import org.apache.logging.log4j.core.test.categories.Layouts; import org.apache.logging.log4j.core.test.junit.LoggerContextRule; import org.apache.logging.log4j.message.ObjectArrayMessage; +import org.apache.logging.log4j.message.SimpleMessage; import org.apache.logging.log4j.test.junit.ThreadContextRule; import org.junit.Assert; import org.junit.Rule; @@ -170,6 +173,19 @@ public void testLayoutTab() throws Exception { testLayoutNormalApi(root, CsvParameterLayout.createLayout(CSVFormat.TDF), true); } + @Test + public void testNullParametersProduceEmptyRecord() { + // SimpleMessage#getParameters() returns null; must not NPE (GH-4243) + final AbstractCsvLayout layout = CsvParameterLayout.createDefaultLayout(); + final LogEvent event = Log4jLogEvent.newBuilder() + .setLoggerName("test") + .setLevel(Level.INFO) + .setMessage(new SimpleMessage("plain text without parameters")) + .build(); + final String result = layout.toSerializable(event); + Assert.assertEquals(layout.getFormat().getRecordSeparator(), result); + } + @Test public void testLogJsonArgument() throws InterruptedException { final ListAppender appender = init.getAppender("List"); diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java index c680ab792d0..c738c80137e 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java @@ -30,6 +30,7 @@ import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.status.StatusLogger; +import org.apache.logging.log4j.util.Constants; /** * A Comma-Separated Value (CSV) layout to log event parameters. @@ -95,7 +96,7 @@ public String toSerializable(final LogEvent event) { final Object[] parameters = message.getParameters(); final StringBuilder buffer = getStringBuilder(); try { - getFormat().printRecord(buffer, parameters); + getFormat().printRecord(buffer, parameters == null ? Constants.EMPTY_OBJECT_ARRAY : parameters); return buffer.toString(); } catch (final IOException e) { StatusLogger.getLogger().error(message, e); diff --git a/src/changelog/.2.x.x/4243_fix_CsvParameterLayout_null_parameters.xml b/src/changelog/.2.x.x/4243_fix_CsvParameterLayout_null_parameters.xml new file mode 100644 index 00000000000..57004d57d0c --- /dev/null +++ b/src/changelog/.2.x.x/4243_fix_CsvParameterLayout_null_parameters.xml @@ -0,0 +1,12 @@ + + + + + Fix `NullPointerException` in `CsvParameterLayout` when a log event has no parameters (for example `SimpleMessage`). + +