diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessorTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessorTest.java index 0c3e6dfabc1..ee333d6fe42 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessorTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessorTest.java @@ -16,6 +16,7 @@ */ package org.apache.logging.log4j.core.appender.rolling; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import java.time.Instant; @@ -29,6 +30,8 @@ import org.junit.jupiter.api.parallel.ResourceAccessMode; import org.junit.jupiter.api.parallel.ResourceLock; import org.junit.jupiter.api.parallel.Resources; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** * Tests the PatternProcessor class. @@ -394,4 +397,10 @@ public void testGetNextTimeDailyReturnsFirstHourOfNextDayInGmtIfZoneIsInvalid() TimeZone.setDefault(old); } } + + @ParameterizedTest + @ValueSource(strings = {"%d{UNIX}", "%d{UNIX_MILLIS}"}) + void does_not_throw_with_unix_pattern(final String pattern) { + assertDoesNotThrow(() -> new PatternProcessor(pattern)); + } } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java index feb26cebc54..ea8998f0175 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java @@ -325,6 +325,10 @@ protected final void formatFileName(final StringBuilder buf, final Object... obj } private RolloverFrequency calculateFrequency(final String pattern) { + // The UNIX and UNIX_MILLIS converters do not have a pattern + if (pattern == null) { + return null; + } if (patternContains(pattern, MILLIS_CHAR)) { return RolloverFrequency.EVERY_MILLISECOND; } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java index 327593c9662..05157f812a3 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java @@ -359,7 +359,7 @@ public void format(final StringBuilder toAppendTo, final Object... objects) { /** * Gets the pattern string describing this date format. * - * @return the pattern string describing this date format. + * @return the pattern string describing this date format or {@code null} if the format does not have a pattern. */ public String getPattern() { return formatter.toPattern(); diff --git a/src/changelog/.2.x.x/2346_unix_millis_data_pattern.xml b/src/changelog/.2.x.x/2346_unix_millis_data_pattern.xml new file mode 100644 index 00000000000..53a94729e19 --- /dev/null +++ b/src/changelog/.2.x.x/2346_unix_millis_data_pattern.xml @@ -0,0 +1,8 @@ + + + + Fix `NullPointerException` in `PatternProcessor` for a `UNIX_MILLIS` pattern. +