You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2022/03/31 04:36:23 UTC

[logging-log4j2] branch release-2.x updated: LOG4J2-3458 LocalizedMessage logs misleading errors on the console.

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

ggregory 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 5eaeb95  LOG4J2-3458 LocalizedMessage logs misleading errors on the console.
5eaeb95 is described below

commit 5eaeb95760b9d4460288fde9c7af3f2cf98765ae
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Mar 31 00:36:17 2022 -0400

    LOG4J2-3458 LocalizedMessage logs misleading errors on the console.
---
 .../log4j/message/StringFormattedMessage.java      |  4 +++
 .../log4j/message/LocalizedMessageFactoryTest.java | 38 +++++++++++++---------
 .../log4j/message/StringFormattedMessageTest.java  | 22 +++++++++++++
 src/changes/changes.xml                            |  3 ++
 4 files changed, 52 insertions(+), 15 deletions(-)

diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java
index a99e2ef..efcec4c 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java
@@ -112,6 +112,10 @@ public class StringFormattedMessage implements Message {
     }
 
     protected String formatMessage(final String msgPattern, final Object... args) {
+        if (args != null && args.length == 0) {
+            // Avoids some exceptions for LOG4J2-3458
+            return msgPattern;
+        }
         try {
             return String.format(locale, msgPattern, args);
         } catch (final IllegalFormatException ife) {
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageFactoryTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageFactoryTest.java
index 940ea23..d76de04 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageFactoryTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageFactoryTest.java
@@ -16,12 +16,12 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.Locale;
 import java.util.ResourceBundle;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
 
 /**
  * Tests {@link LocalizedMessageFactory}.
@@ -57,25 +57,33 @@ public class LocalizedMessageFactoryTest {
     }
 
     @Test
-    public void testNoMatchPercentInMessage() {
-        // Logs the following to the console sadly:
+    public void testNoMatchPercentInMessageNoArgsNo() {
+        // LOG4J2-3458 LocalizedMessage causes a lot of noise on the console
         //
         // ERROR StatusLogger Unable to format msg: C:/Program%20Files/Some%20Company/Some%20Product%20Name/
         // java.util.UnknownFormatConversionException: Conversion = 'F'
-        //  at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2691)
-        //  at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2720)
-        //  at java.util.Formatter.parse(Formatter.java:2560)
-        //  at java.util.Formatter.format(Formatter.java:2501)
-        //  at java.util.Formatter.format(Formatter.java:2455)
-        //  at java.lang.String.format(String.java:2981)
-        //  at org.apache.logging.log4j.message.StringFormattedMessage.formatMessage(StringFormattedMessage.java:116)
-        //  at org.apache.logging.log4j.message.StringFormattedMessage.getFormattedMessage(StringFormattedMessage.java:88)
-        //  at org.apache.logging.log4j.message.FormattedMessage.getFormattedMessage(FormattedMessage.java:178)
-        //  at org.apache.logging.log4j.message.LocalizedMessage.getFormattedMessage(LocalizedMessage.java:196)
-        //  at org.apache.logging.log4j.message.LocalizedMessageFactoryTest.testNoMatchPercentInMessage(LocalizedMessageFactoryTest.java:60)
+        // at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2691)
+        // at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2720)
+        // at java.util.Formatter.parse(Formatter.java:2560)
+        // at java.util.Formatter.format(Formatter.java:2501)
+        // at java.util.Formatter.format(Formatter.java:2455)
+        // at java.lang.String.format(String.java:2981)
+        // at org.apache.logging.log4j.message.StringFormattedMessage.formatMessage(StringFormattedMessage.java:116)
+        // at org.apache.logging.log4j.message.StringFormattedMessage.getFormattedMessage(StringFormattedMessage.java:88)
+        // at org.apache.logging.log4j.message.FormattedMessage.getFormattedMessage(FormattedMessage.java:178)
+        // at org.apache.logging.log4j.message.LocalizedMessage.getFormattedMessage(LocalizedMessage.java:196)
+        // at
+        // org.apache.logging.log4j.message.LocalizedMessageFactoryTest.testNoMatchPercentInMessage(LocalizedMessageFactoryTest.java:60)
         //
         final LocalizedMessageFactory localizedMessageFactory = new LocalizedMessageFactory(ResourceBundle.getBundle("MF", Locale.US));
         final Message message = localizedMessageFactory.newMessage("C:/Program%20Files/Some%20Company/Some%20Product%20Name/");
         assertEquals("C:/Program%20Files/Some%20Company/Some%20Product%20Name/", message.getFormattedMessage());
     }
+
+    @Test
+    public void testNoMatchPercentInMessageArgsYes() {
+        final LocalizedMessageFactory localizedMessageFactory = new LocalizedMessageFactory(ResourceBundle.getBundle("MF", Locale.US));
+        final Message message = localizedMessageFactory.newMessage("C:/Program%20Files/Some%20Company/Some%20Product%20Name/{0}", "One");
+        assertEquals("C:/Program%20Files/Some%20Company/Some%20Product%20Name/One", message.getFormattedMessage());
+    }
 }
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
index 0dd8041..2dd6a8d 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.Locale;
+import java.util.ResourceBundle;
 
 import org.apache.logging.log4j.junit.Mutable;
 import org.junit.jupiter.api.Test;
@@ -128,4 +129,25 @@ public class StringFormattedMessageTest {
         assertEquals(expected.getFormattedMessage(), actual.getFormattedMessage());
         assertArrayEquals(expected.getParameters(), actual.getParameters());
     }
+    
+    @Test
+    public void testPercentInMessageNoArgs() {
+        // LOG4J2-3458 LocalizedMessage causes a lot of noise on the console
+        //
+        // ERROR StatusLogger Unable to format msg: C:/Program%20Files/Some%20Company/Some%20Product%20Name/
+        // java.util.UnknownFormatConversionException: Conversion = 'F'
+        // at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2691)
+        // at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2720)
+        // at java.util.Formatter.parse(Formatter.java:2560)
+        // at java.util.Formatter.format(Formatter.java:2501)
+        // at java.util.Formatter.format(Formatter.java:2455)
+        // at java.lang.String.format(String.java:2981)
+        // at org.apache.logging.log4j.message.StringFormattedMessage.formatMessage(StringFormattedMessage.java:120)
+        // at org.apache.logging.log4j.message.StringFormattedMessage.getFormattedMessage(StringFormattedMessage.java:88)
+        // at
+        // org.apache.logging.log4j.message.StringFormattedMessageTest.testPercentInMessageNoArgs(StringFormattedMessageTest.java:153)
+        final StringFormattedMessage msg = new StringFormattedMessage("C:/Program%20Files/Some%20Company/Some%20Product%20Name/", new Object[] {});
+        assertEquals("C:/Program%20Files/Some%20Company/Some%20Product%20Name/", msg.getFormattedMessage());
+    }
+
 }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 5b1dc04..d3d5b5d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -79,6 +79,9 @@
       <action issue="LOG4J2-3452" dev="stefanvodita" type="fix" due-to="Stefan Vodita">
         Fix and test for race condition in FileUtils.mkdir().
       </action>
+      <action issue="LOG4J2-3458" dev="ggregory" type="fix" due-to="Gary Gregory">
+        LocalizedMessage logs misleading errors on the console.
+      </action>
       <!-- UPDATES -->
       <action issue="LOG4J2-3428" dev="ggregory" type="fix" due-to="LF-Lin">
         Update 3rd party dependencies for 2.17.3.