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

pkarwasz 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 7fde259912 [LOG4J2-3561] Support both whitespace and commas in %style
7fde259912 is described below

commit 7fde2599121113b93ba3331e05740ac691f1ef74
Author: Piotr P. Karwasz <[email protected]>
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
---
 .../logging/log4j/core/pattern/StyleConverter.java |  2 +-
 .../apache/logging/log4j/core/util/Patterns.java   |  5 +++
 .../log4j/core/pattern/HighlightConverterTest.java | 47 ++++++++++------------
 .../log4j/core/pattern/StyleConverterTest.java     | 26 ++++++++++++
 src/changes/changes.xml                            |  3 ++
 src/site/xdoc/manual/layouts.xml.vm                |  4 +-
 6 files changed, 59 insertions(+), 28 deletions(-)

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 acbf2b677e..dfc56757b5 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
@@ -93,7 +93,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.
      */
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
index 121751093f..3878e173b7 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
@@ -20,9 +20,14 @@ 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.*;
 
+import java.util.stream.Stream;
+
 /**
  * Tests the HighlightConverter.
  */
@@ -76,36 +81,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/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
index f82be20705..95c42404ed 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
@@ -18,14 +18,19 @@ 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.junit.LoggerContextSource;
 import org.apache.logging.log4j.junit.Named;
 import org.apache.logging.log4j.test.appender.ListAppender;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import static org.junit.jupiter.api.Assertions.*;
 
@@ -57,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/src/changes/changes.xml b/src/changes/changes.xml
index 2c6badad9b..143ce9e597 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -36,6 +36,9 @@
       <action issue="LOG4J2-3560" dev="ckozak" type="fix" due-to="David 
Schlosnagle">
         Logger$PrivateConfig.filter(Level, Marker, String) was allocating 
empty varargs array.
       </action>
+      <action issue="LOG4J2-3561" dev="pkarwasz" type="fix" due-to="Robert 
Papp">
+        Allows a space separated list of style specifiers in the %style 
pattern for consistency with %highlight.
+      </action>
     </release>
     <release version="2.18.0" date="2022-06-28" description="GA Release 
2.18.0">
       <action issue="LOG4J2-3339" dev="rgoers" type="fix">
diff --git a/src/site/xdoc/manual/layouts.xml.vm 
b/src/site/xdoc/manual/layouts.xml.vm
index 3b99c79bc1..5c99a4d1c0 100644
--- a/src/site/xdoc/manual/layouts.xml.vm
+++ b/src/site/xdoc/manual/layouts.xml.vm
@@ -1742,7 +1742,7 @@ WARN  [main]: Message 2</pre>
               </td>
               <td>
                 <p>Uses ANSI escape sequences to style the result of the 
enclosed pattern. The style can consist of
-                  a comma separated list of style names from the following 
table.
+                  a whitespace separated list of style names from the 
following table.
                   (See Jansi <a href="#enable-jansi">configuration</a>.)
                   <table>
                     <tr>
@@ -1851,7 +1851,7 @@ WARN  [main]: Message 2</pre>
                   <pre>%style{%d{ISO8601}}{black} %style{[%t]}{blue} 
%style{%-5level:}{yellow} %style{%msg%n%throwable}{green}</pre>
                 </p>
                                <p>You can also combine styles:
-                  <pre>%d %highlight{%p} %style{%logger}{bright,cyan} %C{1.} 
%msg%n</pre>
+                  <pre>%d %highlight{%p} %style{%logger}{bright cyan} %C{1.} 
%msg%n</pre>
                 </p>
                                <p>You can also use <code>%</code> with a color 
like <code>%black</code>, <code>%blue</code>, <code>%cyan</code>, and so on. 
For example:
                   <pre>%black{%d{ISO8601}} %blue{[%t]} %yellow{%-5level:} 
%green{%msg%n%throwable}</pre>

Reply via email to