You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by vy...@apache.org on 2021/08/04 06:10:04 UTC

[logging-log4j2] 01/02: LOG4J2-2885: Added support for US-style date patterns and micro/nano seconds (#548)

This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit a6b89a200b36d2ef62d8a66610e7cb66780d7111
Author: Markus Spann <ma...@hotmail.com>
AuthorDate: Wed Aug 4 08:01:39 2021 +0200

    LOG4J2-2885: Added support for US-style date patterns and micro/nano seconds (#548)
    
    Co-authored-by: Markus Spann <sm...@outlook.de>
---
 .../core/time/internal/format/FixedDateFormat.java | 16 +++++--
 .../core/pattern/DatePatternConverterTest.java     | 52 ++++++++++------------
 2 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java
index 77c015f..d4da20f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java
@@ -76,6 +76,16 @@ public class FixedDateFormat {
         DATE_PERIOD("dd MMM yyyy HH:mm:ss.SSS", "dd MMM yyyy ", 0, ':', 1, '.', 1, 3, null),
 
         /**
+         * American date/time format with 2-digit year: {@code "dd/MM/yy HH:mm:ss.SSS"}.
+         */
+        US_MONTH_DAY_YEAR2_TIME("dd/MM/yy HH:mm:ss.SSS", "dd/MM/yy ", 0, ':', 1, '.', 1, 3, null),
+
+        /**
+         * American date/time format with 4-digit year: {@code "dd/MM/yyyy HH:mm:ss.SSS"}.
+         */
+        US_MONTH_DAY_YEAR4_TIME("dd/MM/yyyy HH:mm:ss.SSS", "dd/MM/yyyy ", 0, ':', 1, '.', 1, 3, null),
+
+        /**
          * DEFAULT time format: {@code "yyyy-MM-dd HH:mm:ss,SSS"}.
          */
         DEFAULT("yyyy-MM-dd HH:mm:ss,SSS", "yyyy-MM-dd ", 0, ':', 1, ',', 1, 3, null),
@@ -461,13 +471,13 @@ public class FixedDateFormat {
         }
 
         final String option0 = options[0];
-        final FixedFormat withNanos = FixedFormat.lookupIgnoringNanos(option0);
-        if (withNanos != null) {
+        final FixedFormat withoutNanos = FixedFormat.lookupIgnoringNanos(option0);
+        if (withoutNanos != null) {
             final int[] nanoRange = FixedFormat.nanoRange(option0);
             final int nanoStart = nanoRange[0];
             final int nanoEnd = nanoRange[1];
             final int secondFractionDigits = nanoEnd - nanoStart;
-            return new FixedDateFormat(withNanos, tz, secondFractionDigits);
+            return new FixedDateFormat(withoutNanos, tz, secondFractionDigits);
         }
         final FixedFormat type = FixedFormat.lookup(option0);
         return type == null ? null : new FixedDateFormat(type, tz);
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
index a9362e3..3310929 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
@@ -105,7 +105,7 @@ public class DatePatternConverterTest {
         field.setBoolean(null, threadLocalEnabled.booleanValue());
     }
 
-    private Date date(final int year, final int month, final int date) {
+    private static Date date(final int year, final int month, final int date) {
         final Calendar cal = Calendar.getInstance();
         cal.set(year, month, date, 14, 15, 16);
         cal.set(Calendar.MILLISECOND, 123);
@@ -122,12 +122,7 @@ public class DatePatternConverterTest {
 
     @Test
     public void testFormatDateStringBuilderDefaultPattern() {
-        final DatePatternConverter converter = DatePatternConverter.newInstance(null);
-        final StringBuilder sb = new StringBuilder();
-        converter.format(date(2001, 1, 1), sb);
-
-        final String expected = "2001-02-01 14:15:16,123";
-        assertEquals(expected, sb.toString());
+        assertDatePattern(null, date(2001, 1, 1), "2001-02-01 14:15:16,123");
     }
 
     @Test
@@ -142,24 +137,12 @@ public class DatePatternConverterTest {
 
     @Test
     public void testFormatDateStringBuilderIso8601BasicWithPeriod() {
-        final String[] pattern = {FixedDateFormat.FixedFormat.ISO8601_BASIC_PERIOD.name()};
-        final DatePatternConverter converter = DatePatternConverter.newInstance(pattern);
-        final StringBuilder sb = new StringBuilder();
-        converter.format(date(2001, 1, 1), sb);
-
-        final String expected = "20010201T141516.123";
-        assertEquals(expected, sb.toString());
+        assertDatePattern(FixedDateFormat.FixedFormat.ISO8601_BASIC_PERIOD.name(), date(2001, 1, 1), "20010201T141516.123");
     }
 
     @Test
     public void testFormatDateStringBuilderIso8601WithPeriod() {
-        final String[] pattern = {FixedDateFormat.FixedFormat.ISO8601_PERIOD.name()};
-        final DatePatternConverter converter = DatePatternConverter.newInstance(pattern);
-        final StringBuilder sb = new StringBuilder();
-        converter.format(date(2001, 1, 1), sb);
-
-        final String expected = "2001-02-01T14:15:16.123";
-        assertEquals(expected, sb.toString());
+        assertDatePattern(FixedDateFormat.FixedFormat.ISO8601_PERIOD.name(), date(2001, 1, 1), "2001-02-01T14:15:16.123");
     }
 
     @Test
@@ -180,13 +163,7 @@ public class DatePatternConverterTest {
 
     @Test
     public void testFormatDateStringBuilderOriginalPattern() {
-        final String[] pattern = {"yyyy/MM/dd HH-mm-ss.SSS"};
-        final DatePatternConverter converter = DatePatternConverter.newInstance(pattern);
-        final StringBuilder sb = new StringBuilder();
-        converter.format(date(2001, 1, 1), sb);
-
-        final String expected = "2001/02/01 14-15-16.123";
-        assertEquals(expected, sb.toString());
+        assertDatePattern("yyyy/MM/dd HH-mm-ss.SSS", date(2001, 1, 1), "2001/02/01 14-15-16.123");
     }
 
     @Test
@@ -212,6 +189,25 @@ public class DatePatternConverterTest {
     }
 
     @Test
+    public void testFormatAmericanPatterns() {
+        Date date = date(2011, 2, 11);
+        assertDatePattern("US_MONTH_DAY_YEAR4_TIME", date, "11/03/2011 14:15:16.123");
+        assertDatePattern("US_MONTH_DAY_YEAR2_TIME", date, "11/03/11 14:15:16.123");
+        assertDatePattern("dd/MM/yyyy HH:mm:ss.SSS", date, "11/03/2011 14:15:16.123");
+        assertDatePattern("dd/MM/yyyy HH:mm:ss.nnnnnn", date, "11/03/2011 14:15:16.123000");
+        assertDatePattern("dd/MM/yy HH:mm:ss.SSS", date, "11/03/11 14:15:16.123");
+        assertDatePattern("dd/MM/yy HH:mm:ss.nnnnnn", date, "11/03/11 14:15:16.123000");
+    }
+
+    private static void assertDatePattern(final String format, final Date date, final String expected) {
+        DatePatternConverter converter = DatePatternConverter.newInstance(new String[] {format});
+        StringBuilder sb = new StringBuilder();
+        converter.format(date, sb);
+
+        assertEquals(expected, sb.toString());
+    }
+
+    @Test
     public void testFormatLogEventStringBuilderIso8601TimezoneJST() {
         final LogEvent event = new MyLogEvent();
         final String[] optionsWithTimezone = {ISO8601, "JST"};