This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch release/2.25.4 in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 7a1e0ad385f6e40b5028a006158e01ec6221c824 Author: lrozenblyum <[email protected]> AuthorDate: Mon Dec 29 14:11:59 2025 +0200 Fix warning when last argument is null (#4014) --- .../logging/log4j/message/ParameterFormatterTest.java | 13 +++++++++++++ .../apache/logging/log4j/message/ParameterFormatter.java | 8 +++++++- .../.2.x.x/3975_prevent_warning_for_last_null_argument.xml | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/ParameterFormatterTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/ParameterFormatterTest.java index e4988f4141..37c4a2b7bb 100644 --- a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/ParameterFormatterTest.java +++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/ParameterFormatterTest.java @@ -98,6 +98,19 @@ class ParameterFormatterTest { placeholderCount, argCount, pattern); } + @Test + void format_should_not_warn_on_insufficient_args() { + final String expectedMessage = "pan a"; + final String pattern = "pan {}"; + final String[] args = new String[] {"a", null}; + final int argCount = args.length; + + String actualMessage = ParameterFormatter.format(pattern, args, argCount); + assertThat(actualMessage).isEqualTo(expectedMessage); + final List<StatusData> statusDataList = statusListener.getStatusData().collect(Collectors.toList()); + assertThat(statusDataList).isEmpty(); + } + @ParameterizedTest @MethodSource("messageFormattingTestCases") void format_should_work( diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java index 551f02c7f7..df2d44d83e 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java @@ -247,7 +247,7 @@ final class ParameterFormatter { // #2380: check if the count of placeholder is not equal to the count of arguments if (analysis.placeholderCount != argCount) { final int noThrowableArgCount = - argCount < 1 ? 0 : argCount - ((args[argCount - 1] instanceof Throwable) ? 1 : 0); + argCount < 1 ? 0 : argCount - (isLastArgumentThrowable(args, argCount) ? 1 : 0); if (analysis.placeholderCount != noThrowableArgCount) { STATUS_LOGGER.warn( "found {} argument placeholders, but provided {} for pattern `{}`", @@ -268,6 +268,12 @@ final class ParameterFormatter { } } + private static boolean isLastArgumentThrowable(final Object[] args, final int argCount) { + final Object lastArgument = args[argCount - 1]; + // #3975: tolerate null in the last argument since it could have been Throwable parameter + return (lastArgument == null) || (lastArgument instanceof Throwable); + } + private static void formatMessageContainingNoEscapes( final StringBuilder buffer, final String pattern, diff --git a/src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml b/src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml new file mode 100644 index 0000000000..9c96386fac --- /dev/null +++ b/src/changelog/.2.x.x/3975_prevent_warning_for_last_null_argument.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entry xmlns="https://logging.apache.org/xml/ns" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + https://logging.apache.org/xml/ns + https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" + type="changed"> + <issue id="3975" link="https://github.com/apache/logging-log4j2/issues/3975"/> + <issue id="4014" link="https://github.com/apache/logging-log4j2/pull/4014"/> + <description format="asciidoc"> + Prevent ParameterFormatter issuing a warning in case there is an extra null argument. + Needed to support cases with Throwable parameter that may be null. + </description> +</entry>
