You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2023/01/20 06:54:45 UTC

[logging-log4j2] 03/05: [LOG4J2-3561] Support both whitespace and commas in %style

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

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

commit 3f36f9aa9dafc17bc0e04657fbcc87ff7e4f3f00
Author: Piotr P. Karwasz <pi...@karwasz.org>
AuthorDate: Thu Jul 28 09:22:27 2022 +0200

    [LOG4J2-3561] Support both whitespace and commas in %style
    
    The %style pattern is inconsistent with the %highlight pattern: the
    first separates styles with commas, the second one with spaces. This
    should
---
 .../log4j/core/pattern/HighlightConverterTest.java | 47 ++++++++++------------
 .../log4j/core/pattern/StyleConverterTest.java     | 31 +++++++++++++-
 .../logging/log4j/core/pattern/StyleConverter.java |  2 +-
 .../apache/logging/log4j/core/util/Patterns.java   |  5 +++
 4 files changed, 58 insertions(+), 27 deletions(-)

diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
index 8a44c6096c..c98be60aa1 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
@@ -16,11 +16,16 @@
  */
 package org.apache.logging.log4j.core.pattern;
 
+import java.util.stream.Stream;
+
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import static org.junit.jupiter.api.Assertions.*;
 
@@ -77,36 +82,28 @@ public class HighlightConverterTest {
         assertEquals(AnsiEscape.createSequence(colorName), converter.getLevelStyle(Level.DEBUG));
     }
 
-   private void testLevelNames(final String colorName, final String expectedOutput) {
-        final String[] options = {"%-5level: %msg", PatternParser.NO_CONSOLE_NO_ANSI + "=false, "
-                + PatternParser.DISABLE_ANSI + "=false, " + "INFO=" + colorName};
+    static Stream<Arguments> colors() {
+        return Stream.of(
+                Arguments.of("bright red","\u001B[1;31m"),
+                Arguments.of("red bright", "\u001B[31;1m"),
+                Arguments.of("bright_red", "\u001B[91m"),
+                Arguments.of("#1cd42b", "\u001B[38;2;28;212;43m"),
+                Arguments.of("fg_bright_red bg_bright_blue bold", "\u001B[91;104;1m"),
+                Arguments.of("FG_#1cd42b BG_#000000", "\u001B[38;2;28;212;43;48;2;0;0;0m"));
+    }
+
+    @ParameterizedTest
+    @MethodSource("colors")
+    public void testColors(final String colorName, final String escape) {
+        final String[] options = { "%-5level: %msg", PatternParser.NO_CONSOLE_NO_ANSI + "=false, "
+                + PatternParser.DISABLE_ANSI + "=false, " + "INFO=" + colorName };
         final HighlightConverter converter = HighlightConverter.newInstance(null, options);
         assertNotNull(converter);
 
-        final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.INFO).setLoggerName("a.b.c").setMessage(
-                new SimpleMessage("")).build();
+        final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.INFO).build();
         final StringBuilder buffer = new StringBuilder();
         converter.format(event, buffer);
-        assertEquals(expectedOutput, buffer.toString());
-   }
-
-    @Test
-    public void testLevelNamesBrightShort() {
-        testLevelNames("bright_red", "\u001B[91mINFO : \u001B[m");
-    }
-
-    public void testLevelNamesHexShort() {
-        testLevelNames("#1cd42b", "\u001B[38;2;28;212;43mINFO : \u001B[m");
-    }
-
-    @Test
-    public void testLevelNamesBrightFull() {
-        testLevelNames("fg_bright_red bg_bright_blue bold", "\u001B[91;104;1mINFO : \u001B[m");
-    }
-
-    @Test
-    public void testLevelNamesHexFull() {
-        testLevelNames("FG_#1cd42b BG_#000000", "\u001B[38;2;28;212;43;48;2;0;0;0mINFO : \u001B[m");
+        assertEquals(escape + "INFO : \u001B[m", buffer.toString());
     }
 
     @Test
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
index fefd76f669..db9d5ea358 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
@@ -18,17 +18,25 @@ package org.apache.logging.log4j.core.pattern;
 
 import java.util.List;
 
+import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.impl.Log4jProperties;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.test.junit.Named;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 import org.junitpioneer.jupiter.SetSystemProperty;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @SetSystemProperty(key = Log4jProperties.JANSI_DISABLED, value = "false")
 public class StyleConverterTest {
@@ -54,4 +62,25 @@ public class StyleConverterTest {
     public void testNull() {
         assertNull(StyleConverter.newInstance(null, null));
     }
+
+    @ParameterizedTest
+    @MethodSource("org.apache.logging.log4j.core.pattern.HighlightConverterTest#colors")
+    public void testHighlightConverterCompatibility(final String color, final String escape) {
+        final StyleConverter converter = StyleConverter.newInstance(null, new String[] { "Hello!", color });
+        final StringBuilder sb = new StringBuilder();
+        final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.INFO).build();
+        converter.format(event, sb);
+        assertEquals(escape + "Hello!" + AnsiEscape.getDefaultStyle(), sb.toString());
+    }
+
+    @ParameterizedTest
+    @MethodSource("org.apache.logging.log4j.core.pattern.HighlightConverterTest#colors")
+    public void testLegacyCommaSeparator(final String color, final String escape) {
+        final StyleConverter converter = StyleConverter.newInstance(null,
+                new String[] { "Hello!", color.replaceAll("\\s+", ",") });
+        final StringBuilder sb = new StringBuilder();
+        final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.INFO).build();
+        converter.format(event, sb);
+        assertEquals(escape + "Hello!" + AnsiEscape.getDefaultStyle(), sb.toString());
+    }
 }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
index e102f7306a..bad779148e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
@@ -95,7 +95,7 @@ public final class StyleConverter extends LogEventPatternConverter implements An
         }
         final PatternParser parser = PatternLayout.createPatternParser(config);
         final List<PatternFormatter> formatters = parser.parse(options[0]);
-        final String style = AnsiEscape.createSequence(options[1].split(Patterns.COMMA_SEPARATOR));
+        final String style = AnsiEscape.createSequence(options[1].split(Patterns.COMMA_SPACE_SEPARATOR));
         final boolean disableAnsi = Arrays.toString(options).contains(PatternParser.DISABLE_ANSI + "=true");
         final boolean noConsoleNoAnsi = Arrays.toString(options).contains(PatternParser.NO_CONSOLE_NO_ANSI + "=true");
         final boolean hideAnsi = disableAnsi || (noConsoleNoAnsi && System.console() == null);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Patterns.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Patterns.java
index 5427197072..cd329f9307 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Patterns.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Patterns.java
@@ -28,6 +28,11 @@ public final class Patterns {
      */
     public static final String COMMA_SEPARATOR = toWhitespaceSeparator(",");
 
+    /**
+     * A pattern string for lists separated by commas with optional whitespace or just whitespace.
+     */
+    public static final String COMMA_SPACE_SEPARATOR = toWhitespaceSeparator("[,\\s]");
+
     /**
      * The whitespace pattern string.
      */