This is an automated email from the ASF dual-hosted git repository.
pkarwasz pushed a commit to branch fix/2346_unix_millis_date_pattern
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to
refs/heads/fix/2346_unix_millis_date_pattern by this push:
new 48ebcf9c6a Fix NPE in `PatternProcessor` for the `UNIX` pattern
48ebcf9c6a is described below
commit 48ebcf9c6aadcd5b6494079c08fa07820927ceec
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Tue Mar 5 13:39:33 2024 +0100
Fix NPE in `PatternProcessor` for the `UNIX` pattern
Closes 2346.
The constructor of `PatternProcessor` fails to recognize the `UNIX` and
`UNIX_MILLIS` data patterns and deduce the correct rollover frequency.
This PR maps those two patterns to a rollover frequency of second and
millisecond respectively.
---
.../core/appender/rolling/PatternProcessorTest.java | 19 +++++++++++++++++++
.../log4j/core/appender/rolling/PatternProcessor.java | 6 ++++++
.../log4j/core/pattern/DatePatternConverter.java | 14 +++++++++++---
.../.2.x.x/2346_unix_millis_data_pattern.xml | 8 ++++++++
4 files changed, 44 insertions(+), 3 deletions(-)
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 0c3e6dfabc..b694f58a35 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,8 @@
*/
package org.apache.logging.log4j.core.appender.rolling;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.time.Instant;
@@ -25,10 +27,14 @@ import java.time.ZoneId;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
+import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
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.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
/**
* Tests the PatternProcessor class.
@@ -394,4 +400,17 @@ public class PatternProcessorTest {
TimeZone.setDefault(old);
}
}
+
+ static Stream<Arguments> works_with_unix_pattern() {
+ return Stream.of(
+ Arguments.of("%d{UNIX}", RolloverFrequency.EVERY_SECOND),
+ Arguments.of("%d{UNIX_MILLIS}",
RolloverFrequency.EVERY_MILLISECOND));
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ void works_with_unix_pattern(final String pattern, final RolloverFrequency
expectedFrequency) {
+ final PatternProcessor processor = assertDoesNotThrow(() -> new
PatternProcessor(pattern));
+ assertThat(processor.getFrequency()).isEqualTo(expectedFrequency);
+ }
}
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 feb26cebc5..67a40a818c 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,12 @@ public class PatternProcessor {
}
private RolloverFrequency calculateFrequency(final String pattern) {
+ if ("UNIX".equals(pattern)) {
+ return RolloverFrequency.EVERY_SECOND;
+ }
+ if ("UNIX_MILLIS".equals(pattern)) {
+ return RolloverFrequency.EVERY_MILLISECOND;
+ }
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 327593c966..40c812c50a 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
@@ -48,9 +48,7 @@ public final class DatePatternConverter extends
LogEventPatternConverter impleme
abstract void formatToBuffer(final Instant instant, StringBuilder
destination);
- public String toPattern() {
- return null;
- }
+ public abstract String toPattern();
public TimeZone getTimeZone() {
return TimeZone.getDefault();
@@ -143,6 +141,11 @@ public final class DatePatternConverter extends
LogEventPatternConverter impleme
void formatToBuffer(final Instant instant, final StringBuilder
destination) {
destination.append(instant.getEpochSecond()); // no need for
caching
}
+
+ @Override
+ public String toPattern() {
+ return UNIX_FORMAT;
+ }
}
private static final class UnixMillisFormatter extends Formatter {
@@ -156,6 +159,11 @@ public final class DatePatternConverter extends
LogEventPatternConverter impleme
void formatToBuffer(final Instant instant, final StringBuilder
destination) {
destination.append(instant.getEpochMillisecond()); // no need for
caching
}
+
+ @Override
+ public String toPattern() {
+ return UNIX_MILLIS_FORMAT;
+ }
}
private final class CachedTime {
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 0000000000..53a94729e1
--- /dev/null
+++ b/src/changelog/.2.x.x/2346_unix_millis_data_pattern.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://logging.apache.org/log4j/changelog"
+ xsi:schemaLocation="http://logging.apache.org/log4j/changelog
https://logging.apache.org/log4j/changelog-0.1.3.xsd"
+ type="changed">
+ <issue id="2346" link="https://github.com/apache/logging-log4j2/pull/2346"/>
+ <description format="asciidoc">Fix `NullPointerException` in
`PatternProcessor` for a `UNIX_MILLIS` pattern.</description>
+</entry>