You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2023/01/02 00:01:22 UTC

[logging-log4j2] branch release-2.x updated: LOG4J2-2297 - Format java.sql.time correctly

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

rgoers pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new 29804e2068 LOG4J2-2297 - Format java.sql.time correctly
29804e2068 is described below

commit 29804e2068e29739ef4fb009ba39cf1e0e3d4e95
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sun Jan 1 16:59:19 2023 -0700

    LOG4J2-2297 - Format java.sql.time correctly
---
 .../apache/logging/log4j/message/MapMessageTest.java   | 18 ++++++++++++++----
 .../logging/log4j/message/ParameterFormatter.java      | 18 ++++++++++--------
 .../org/apache/logging/log4j/util/StringBuilders.java  |  2 ++
 3 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 0df4685e4d..eb83c09be3 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -16,17 +16,19 @@
  */
 package org.apache.logging.log4j.message;
 
-import com.google.common.base.Strings;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
-import org.junit.jupiter.api.Test;
-
 import java.math.BigDecimal;
+import java.sql.Time;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.junit.jupiter.api.Test;
+
+import com.google.common.base.Strings;
+
 import static org.junit.jupiter.api.Assertions.*;
 
 /**
@@ -311,6 +313,14 @@ public class MapMessageTest {
         assertEquals(expected, result);
     }
 
+    @Test
+    public void testTime() throws Exception {
+        final Time time = new Time(12, 5, 5);
+        final ObjectMapMessage message = new ObjectMapMessage().with("time", time);
+        assertEquals("time=\"" + time.toString() + "\"",
+                message.getFormattedMessage(), "Incorrect time format");
+    }
+
     private static final class FormattableTestType implements StringBuilderFormattable {
 
         @Override
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 1cc3b0c3a0..c0994ada32 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
@@ -16,9 +16,12 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.apache.logging.log4j.util.StringBuilders;
-
+import java.sql.Time;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -27,6 +30,8 @@ import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.logging.log4j.util.StringBuilders;
+
 /**
  * Supports parameter formatting as used in ParameterizedMessage and ReusableParameterizedMessage.
  */
@@ -61,8 +66,7 @@ final class ParameterFormatter {
     private static final char DELIM_STOP = '}';
     private static final char ESCAPE_CHAR = '\\';
 
-    private static final ThreadLocal<SimpleDateFormat> SIMPLE_DATE_FORMAT_REF =
-            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
 
     private ParameterFormatter() {
     }
@@ -485,12 +489,10 @@ final class ParameterFormatter {
     }
 
     private static boolean appendDate(final Object o, final StringBuilder str) {
-        if (!(o instanceof Date)) {
+        if (o instanceof Time || !(o instanceof Date)) {
             return false;
         }
-        final Date date = (Date) o;
-        final SimpleDateFormat format = SIMPLE_DATE_FORMAT_REF.get();
-        str.append(format.format(date));
+        str.append(ZonedDateTime.ofInstant(((Date) o).toInstant(), ZoneId.systemDefault()).format(DATE_FORMATTER));
         return true;
     }
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
index a45fa5ae93..3868850e85 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
@@ -97,6 +97,8 @@ public final class StringBuilders {
             stringBuilder.append(((Float) obj).floatValue());
         } else if (obj instanceof Byte) {
             stringBuilder.append(((Byte) obj).byteValue());
+        } else if (obj instanceof java.sql.Time || obj instanceof java.time.temporal.Temporal) {
+            stringBuilder.append(obj);
         } else {
             return false;
         }