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 16:05:02 UTC

[logging-log4j2] branch master updated (49290ca254 -> 8baedd7794)

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

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


    from 49290ca254 Update copyright
     new 7b10ba69cc LOG4J2-2297 - Allow java.sql.Time objects to format properly in MapMessages.
     new 8baedd7794 Revert usage of artifical Clock in test as it causes occasional deadlocks

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../logging/log4j/message/MapMessageTest.java      | 17 ++++--
 log4j-api/src/main/java/module-info.java           |  1 +
 .../apache/logging/log4j/util/StringBuilders.java  | 26 +++++++++
 .../appender/rolling/RollingAppenderTimeTest.java  | 61 +++++++++++++---------
 src/changes/changes.xml                            |  3 ++
 5 files changed, 78 insertions(+), 30 deletions(-)


[logging-log4j2] 01/02: LOG4J2-2297 - Allow java.sql.Time objects to format properly in MapMessages.

Posted by rg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 7b10ba69cc2af35c666af66fc54656f76cd0b152
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Mon Jan 2 09:04:00 2023 -0700

    LOG4J2-2297 - Allow java.sql.Time objects to format properly in MapMessages.
---
 .../logging/log4j/message/MapMessageTest.java      | 17 ++++++++++----
 log4j-api/src/main/java/module-info.java           |  1 +
 .../apache/logging/log4j/util/StringBuilders.java  | 26 ++++++++++++++++++++++
 src/changes/changes.xml                            |  3 +++
 4 files changed, 43 insertions(+), 4 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 d420e2bf7f..106cce2c97 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,18 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.apache.logging.log4j.util.StringBuilderFormattable;
-import org.apache.logging.log4j.util.Strings;
-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.apache.logging.log4j.util.Strings;
+import org.junit.jupiter.api.Test;
+
 import static org.junit.jupiter.api.Assertions.*;
 
 /**
@@ -311,6 +312,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/module-info.java b/log4j-api/src/main/java/module-info.java
index 732b3d595d..57f500e63e 100644
--- a/log4j-api/src/main/java/module-info.java
+++ b/log4j-api/src/main/java/module-info.java
@@ -38,6 +38,7 @@ module org.apache.logging.log4j {
     exports org.apache.logging.log4j.status;
     exports org.apache.logging.log4j.util;
 
+    requires static java.sql;
     requires static org.osgi.framework;
     uses org.apache.logging.log4j.spi.Provider;
     uses PropertySource;
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 e5b0e53273..d0c931d039 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
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.util;
 
+import java.lang.reflect.Array;
+import java.util.Collections;
 import java.util.Map.Entry;
 
 import static java.lang.Character.toLowerCase;
@@ -25,6 +27,21 @@ import static java.lang.Character.toLowerCase;
  */
 @InternalApi
 public final class StringBuilders {
+
+    private static final Object timeClass;
+
+    static {
+        Object obj;
+        try {
+            Class<?> clazz = Class.forName("java.sql.Time");
+            long current = System.currentTimeMillis();
+            obj = clazz.getDeclaredConstructor(Long.TYPE).newInstance(current);
+        } catch(Exception ex) {
+            obj = null;
+        }
+        timeClass = obj;
+    }
+
     private StringBuilders() {
     }
 
@@ -118,12 +135,21 @@ public final class StringBuilders {
             stringBuilder.append(((Float) obj).floatValue());
         } else if (obj instanceof Byte) {
             stringBuilder.append(((Byte) obj).byteValue());
+        } else if (isTime(obj) || obj instanceof java.time.temporal.Temporal) {
+            stringBuilder.append(obj);
         } else {
             return false;
         }
         return true;
     }
 
+    /*
+        Check to see if obj is an instance of java.sql.time without requiring the java.sql module.
+     */
+    private static boolean isTime(final Object obj) {
+        return obj.getClass().isInstance(timeClass);
+    }
+
     /**
      * Returns true if the specified section of the left CharSequence equals the specified section of the right
      * CharSequence.
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f3d8ba836a..b87c3cfbc9 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -202,6 +202,9 @@
       </action>
     </release>
     <release version="2.19.1" date="TBD" description="GA Release 2.19.1">
+      <action issue="LOG4J2-2297" dev="rgoers" type="fix">
+        Allow java.sql.Time objects to format properly in MapMessages.
+      </action>
       <action issue="LOG4J2-2785" dev="rgoers" type="add" due-to="Markus Spann">
         Pattern Layout to abbreviate the name of all logger components except the 2 rightmost.
       </action>


[logging-log4j2] 02/02: Revert usage of artifical Clock in test as it causes occasional deadlocks

Posted by rg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8baedd77949e4ff4c9d9999d747ff30e39903309
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Mon Jan 2 09:04:43 2023 -0700

    Revert usage of artifical Clock in test as it causes occasional deadlocks
---
 .../appender/rolling/RollingAppenderTimeTest.java  | 61 +++++++++++++---------
 1 file changed, 35 insertions(+), 26 deletions(-)

diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderTimeTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderTimeTest.java
index 3633c38368..3233341d43 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderTimeTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderTimeTest.java
@@ -16,48 +16,57 @@
  */
 package org.apache.logging.log4j.core.appender.rolling;
 
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
-import org.apache.logging.log4j.plugins.Named;
-import org.apache.logging.log4j.test.junit.CleanUpDirectories;
-import org.junit.jupiter.api.Test;
-
 import java.io.File;
-import java.util.concurrent.CountDownLatch;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
+import org.hamcrest.Matcher;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+
+import static org.apache.logging.log4j.core.test.hamcrest.Descriptors.that;
+import static org.apache.logging.log4j.core.test.hamcrest.FileMatchers.hasName;
+import static org.hamcrest.Matchers.endsWith;
+import static org.hamcrest.Matchers.hasItemInArray;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  *
  */
-public class RollingAppenderTimeTest extends AbstractRollingListenerTest {
+public class RollingAppenderTimeTest {
 
     private static final String CONFIG = "log4j-rolling2.xml";
     private static final String DIR = "target/rolling2";
-    private final CountDownLatch rollover = new CountDownLatch(1);
+
+    private final LoggerContextRule loggerContextRule = LoggerContextRule.createShutdownTimeoutLoggerContextRule(CONFIG);
+
+    @Rule
+    public RuleChain chain = loggerContextRule.withCleanFoldersRule(DIR);
 
     @Test
-    @CleanUpDirectories(DIR)
-    @LoggerContextSource(value = CONFIG, timeout = 10)
-    public void testAppender(final LoggerContext context, @Named("RollingFile") final RollingFileManager manager) throws Exception {
-        manager.addRolloverListener(this);
-        final Logger logger = context.getLogger(getClass());
+    public void testAppender() throws Exception {
+        final Logger logger = loggerContextRule.getLogger();
         logger.debug("This is test message number 1");
-        currentTimeMillis.addAndGet(1500);
+        Thread.sleep(1500);
         // Trigger the rollover
         for (int i = 0; i < 16; ++i) {
-            logger.debug("This is test message number {}", i + 1);
-            currentTimeMillis.addAndGet(100);
+            logger.debug("This is test message number " + i + 1);
         }
-        rollover.await();
         final File dir = new File(DIR);
-        assertThat(dir).isNotEmptyDirectory();
-        assertThat(dir).isDirectoryContaining("glob:**.gz");
-    }
+        assertTrue("Directory not created", dir.exists() && dir.listFiles().length > 0);
 
-    @Override
-    public void rolloverComplete(final String fileName) {
-        rollover.countDown();
+        final int MAX_TRIES = 20;
+        final Matcher<File[]> hasGzippedFile = hasItemInArray(that(hasName(that(endsWith(".gz")))));
+        for (int i = 0; i < MAX_TRIES; i++) {
+            final File[] files = dir.listFiles();
+            if (hasGzippedFile.matches(files)) {
+                return; // test succeeded
+            }
+            logger.debug("Adding additional event " + i);
+            Thread.sleep(100); // Allow time for rollover to complete
+        }
+        fail("No compressed files found");
     }
 }