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>