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

[logging-log4j2] branch master 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 master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new 55a0147  [LOG4J2-3458] LocalizedMessage logs misleading errors on the console.
55a0147 is described below

commit 55a0147ec3cef9cd87c9f96e5ceb202eeb487249
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Mar 31 01:02:29 2022 -0400

    [LOG4J2-3458] LocalizedMessage logs misleading errors on the console.
    
    Can't cherry-pick from release-2.x.
---
 .../log4j/message/LocalizedMessageFactoryTest.java | 57 ++++++++++++++++++++--
 .../log4j/message/StringFormattedMessageTest.java  | 21 ++++++++
 .../log4j/message/StringFormattedMessage.java      |  4 ++
 src/changes/changes.xml                            |  6 +++
 4 files changed, 85 insertions(+), 3 deletions(-)

diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/LocalizedMessageFactoryTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/LocalizedMessageFactoryTest.java
index 6c6571b..6881cd9 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/LocalizedMessageFactoryTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/LocalizedMessageFactoryTest.java
@@ -33,13 +33,26 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 public class LocalizedMessageFactoryTest {
 
     @Test
+    public void testMessageMarkersDataNo() {
+        final LocalizedMessageFactory localizedMessageFactory = new LocalizedMessageFactory(ResourceBundle.getBundle("MF", Locale.US));
+        final Message message = localizedMessageFactory.newMessage("msg1");
+        assertEquals("This is test number {0} with string argument {1}.", message.getFormattedMessage());
+    }
+
+    @Test
+    public void testMessageMarkersNoDataYes() {
+        final LocalizedMessageFactory localizedMessageFactory = new LocalizedMessageFactory(ResourceBundle.getBundle("MF", Locale.US));
+        final Message message = localizedMessageFactory.newMessage("msg1", 1, "two");
+        assertEquals("This is test number 1 with string argument two.", message.getFormattedMessage());
+    }
+
+    @Test
     public void testNewMessage() {
-        final LocalizedMessageFactory localizedMessageFactory = new LocalizedMessageFactory(
-                ResourceBundle.getBundle("MF", Locale.US));
+        final LocalizedMessageFactory localizedMessageFactory = new LocalizedMessageFactory(ResourceBundle.getBundle("MF", Locale.US));
         final Message message = localizedMessageFactory.newMessage("hello_world");
         assertEquals("Hello world.", message.getFormattedMessage());
     }
-	
+
     @Test
     @ResourceLock(Resources.LOCALE)
     public void testNewMessageUsingBaseName() {
@@ -54,4 +67,42 @@ public class LocalizedMessageFactoryTest {
             Locale.setDefault(defaultLocale);
         }
     }
+
+    @Test
+    public void testNoMatch() {
+        final LocalizedMessageFactory localizedMessageFactory = new LocalizedMessageFactory(ResourceBundle.getBundle("MF", Locale.US));
+        final Message message = localizedMessageFactory.newMessage("no match");
+        assertEquals("no match", 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());
+    }
+	
+    @Test
+    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)
+        //
+        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());
+    }
 }
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
index ddd96a6..08035a3 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
@@ -129,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/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 a366a24..dbc0daa 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
@@ -113,6 +113,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/src/changes/changes.xml b/src/changes/changes.xml
index 6ebb56b..340d9d5 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -191,6 +191,12 @@
 		Fixes incorrect constructor call in LocalizedMessageFactory.
       </action>
     </release>
+    <release version="2.17.3" date="20YY-MM-DD" description="GA Release 2.17.3">
+      <!-- FIXES -->
+      <action issue="LOG4J2-3458" dev="ggregory" type="fix" due-to="Gary Gregory">
+        LocalizedMessage logs misleading errors on the console.
+      </action>
+    </release>
     <release version="2.17.2" date="20YY-MM-DD" description="GA Release 2.17.2">
       <!-- FIXES -->
       <action issue="LOG4J2-3304" dev="rgoers" type="fix" due-to="francis-FY">