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>

Reply via email to