From 35994bbd749f97180788fa3f2fb1a140d0916c20 Mon Sep 17 00:00:00 2001 From: Abhijeet Mishra Date: Fri, 24 Mar 2023 14:16:51 +0530 Subject: [PATCH 1/2] Add support for additional colors in Log4j2 and Logback See gh-34749 --- .../boot/logging/log4j2/ColorConverter.java | 10 +++ .../boot/logging/logback/ColorConverter.java | 10 +++ .../logging/log4j2/ColorConverterTests.java | 70 +++++++++++++++++++ .../logging/logback/ColorConverterTests.java | 70 +++++++++++++++++++ 4 files changed, 160 insertions(+) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ColorConverter.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ColorConverter.java index e5795fbbf2..90feb0c62b 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ColorConverter.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ColorConverter.java @@ -60,6 +60,16 @@ public final class ColorConverter extends LogEventPatternConverter { ansiElements.put("blue", AnsiColor.BLUE); ansiElements.put("magenta", AnsiColor.MAGENTA); ansiElements.put("cyan", AnsiColor.CYAN); + ansiElements.put("white", AnsiColor.WHITE); + ansiElements.put("black", AnsiColor.BLACK); + ansiElements.put("bright_black", AnsiColor.BRIGHT_BLACK); + ansiElements.put("bright_red", AnsiColor.BRIGHT_RED); + ansiElements.put("bright_green", AnsiColor.BRIGHT_GREEN); + ansiElements.put("bright_yellow", AnsiColor.BRIGHT_YELLOW); + ansiElements.put("bright_blue", AnsiColor.BRIGHT_BLUE); + ansiElements.put("bright_magenta", AnsiColor.BRIGHT_MAGENTA); + ansiElements.put("bright_cyan", AnsiColor.BRIGHT_CYAN); + ansiElements.put("bright_white", AnsiColor.BRIGHT_WHITE); ELEMENTS = Collections.unmodifiableMap(ansiElements); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/ColorConverter.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/ColorConverter.java index 8011e0c230..ac650b9979 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/ColorConverter.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/ColorConverter.java @@ -50,6 +50,16 @@ public class ColorConverter extends CompositeConverter { ansiElements.put("blue", AnsiColor.BLUE); ansiElements.put("magenta", AnsiColor.MAGENTA); ansiElements.put("cyan", AnsiColor.CYAN); + ansiElements.put("white", AnsiColor.WHITE); + ansiElements.put("black", AnsiColor.BLACK); + ansiElements.put("bright_black", AnsiColor.BRIGHT_BLACK); + ansiElements.put("bright_red", AnsiColor.BRIGHT_RED); + ansiElements.put("bright_green", AnsiColor.BRIGHT_GREEN); + ansiElements.put("bright_yellow", AnsiColor.BRIGHT_YELLOW); + ansiElements.put("bright_blue", AnsiColor.BRIGHT_BLUE); + ansiElements.put("bright_magenta", AnsiColor.BRIGHT_MAGENTA); + ansiElements.put("bright_cyan", AnsiColor.BRIGHT_CYAN); + ansiElements.put("bright_white", AnsiColor.BRIGHT_WHITE); ELEMENTS = Collections.unmodifiableMap(ansiElements); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ColorConverterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ColorConverterTests.java index 84da00eeb0..d1a8cdd787 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ColorConverterTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ColorConverterTests.java @@ -106,6 +106,76 @@ class ColorConverterTests { assertThat(output).hasToString("\033[36min\033[0;39m"); } + @Test + void white() { + StringBuilder output = new StringBuilder(); + newConverter("white").format(this.event, output); + assertThat(output).hasToString("\033[37min\033[0;39m"); + } + + @Test + void black() { + StringBuilder output = new StringBuilder(); + newConverter("black").format(this.event, output); + assertThat(output).hasToString("\033[30min\033[0;39m"); + } + + @Test + void brightBlack() { + StringBuilder output = new StringBuilder(); + newConverter("bright_black").format(this.event, output); + assertThat(output).hasToString("\033[90min\033[0;39m"); + } + + @Test + void brightRed() { + StringBuilder output = new StringBuilder(); + newConverter("bright_red").format(this.event, output); + assertThat(output).hasToString("\033[91min\033[0;39m"); + } + + @Test + void brightGreen() { + StringBuilder output = new StringBuilder(); + newConverter("bright_green").format(this.event, output); + assertThat(output).hasToString("\033[92min\033[0;39m"); + } + + @Test + void brightYellow() { + StringBuilder output = new StringBuilder(); + newConverter("bright_yellow").format(this.event, output); + assertThat(output).hasToString("\033[93min\033[0;39m"); + } + + @Test + void brightBlue() { + StringBuilder output = new StringBuilder(); + newConverter("bright_blue").format(this.event, output); + assertThat(output).hasToString("\033[94min\033[0;39m"); + } + + @Test + void brightMagenta() { + StringBuilder output = new StringBuilder(); + newConverter("bright_magenta").format(this.event, output); + assertThat(output).hasToString("\033[95min\033[0;39m"); + } + + @Test + void brightCyan() { + StringBuilder output = new StringBuilder(); + newConverter("bright_cyan").format(this.event, output); + assertThat(output).hasToString("\033[96min\033[0;39m"); + } + + @Test + void brightWhite() { + StringBuilder output = new StringBuilder(); + newConverter("bright_white").format(this.event, output); + assertThat(output).hasToString("\033[97min\033[0;39m"); + } + @Test void highlightFatal() { this.event.setLevel(Level.FATAL); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/ColorConverterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/ColorConverterTests.java index f4e1abb468..94c0391fe7 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/ColorConverterTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/ColorConverterTests.java @@ -100,6 +100,76 @@ class ColorConverterTests { assertThat(out).isEqualTo("\033[36min\033[0;39m"); } + @Test + void white() { + this.converter.setOptionList(Collections.singletonList("white")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[37min\033[0;39m"); + } + + @Test + void black() { + this.converter.setOptionList(Collections.singletonList("black")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[30min\033[0;39m"); + } + + @Test + void brightBlack() { + this.converter.setOptionList(Collections.singletonList("bright_black")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[90min\033[0;39m"); + } + + @Test + void brightRed() { + this.converter.setOptionList(Collections.singletonList("bright_red")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[91min\033[0;39m"); + } + + @Test + void brightGreen() { + this.converter.setOptionList(Collections.singletonList("bright_green")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[92min\033[0;39m"); + } + + @Test + void brightYellow() { + this.converter.setOptionList(Collections.singletonList("bright_yellow")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[93min\033[0;39m"); + } + + @Test + void brightBlue() { + this.converter.setOptionList(Collections.singletonList("bright_blue")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[94min\033[0;39m"); + } + + @Test + void brightMagenta() { + this.converter.setOptionList(Collections.singletonList("bright_magenta")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[95min\033[0;39m"); + } + + @Test + void brightCyan() { + this.converter.setOptionList(Collections.singletonList("bright_cyan")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[96min\033[0;39m"); + } + + @Test + void brightWhite() { + this.converter.setOptionList(Collections.singletonList("bright_white")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[97min\033[0;39m"); + } + @Test void highlightError() { this.event.setLevel(Level.ERROR); From 6cf08a36da7f15f2dda0c76527dd8e6d9fb32f87 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 5 Apr 2023 14:54:45 +0200 Subject: [PATCH 2/2] Polish "Add support for additional colors in Log4j2 and Logback" See gh-34749 --- .../boot/logging/log4j2/ColorConverter.java | 8 ++-- .../boot/logging/logback/ColorConverter.java | 8 ++-- .../logging/log4j2/ColorConverterTests.java | 42 +++++++++--------- .../logging/logback/ColorConverterTests.java | 44 +++++++++---------- 4 files changed, 51 insertions(+), 51 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ColorConverter.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ColorConverter.java index 90feb0c62b..84bcedb404 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ColorConverter.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ColorConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,6 +53,8 @@ public final class ColorConverter extends LogEventPatternConverter { static { Map ansiElements = new HashMap<>(); + ansiElements.put("black", AnsiColor.BLACK); + ansiElements.put("white", AnsiColor.WHITE); ansiElements.put("faint", AnsiStyle.FAINT); ansiElements.put("red", AnsiColor.RED); ansiElements.put("green", AnsiColor.GREEN); @@ -60,16 +62,14 @@ public final class ColorConverter extends LogEventPatternConverter { ansiElements.put("blue", AnsiColor.BLUE); ansiElements.put("magenta", AnsiColor.MAGENTA); ansiElements.put("cyan", AnsiColor.CYAN); - ansiElements.put("white", AnsiColor.WHITE); - ansiElements.put("black", AnsiColor.BLACK); ansiElements.put("bright_black", AnsiColor.BRIGHT_BLACK); + ansiElements.put("bright_white", AnsiColor.BRIGHT_WHITE); ansiElements.put("bright_red", AnsiColor.BRIGHT_RED); ansiElements.put("bright_green", AnsiColor.BRIGHT_GREEN); ansiElements.put("bright_yellow", AnsiColor.BRIGHT_YELLOW); ansiElements.put("bright_blue", AnsiColor.BRIGHT_BLUE); ansiElements.put("bright_magenta", AnsiColor.BRIGHT_MAGENTA); ansiElements.put("bright_cyan", AnsiColor.BRIGHT_CYAN); - ansiElements.put("bright_white", AnsiColor.BRIGHT_WHITE); ELEMENTS = Collections.unmodifiableMap(ansiElements); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/ColorConverter.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/ColorConverter.java index ac650b9979..7b1890257a 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/ColorConverter.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/ColorConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,8 @@ public class ColorConverter extends CompositeConverter { static { Map ansiElements = new HashMap<>(); + ansiElements.put("black", AnsiColor.BLACK); + ansiElements.put("white", AnsiColor.WHITE); ansiElements.put("faint", AnsiStyle.FAINT); ansiElements.put("red", AnsiColor.RED); ansiElements.put("green", AnsiColor.GREEN); @@ -50,16 +52,14 @@ public class ColorConverter extends CompositeConverter { ansiElements.put("blue", AnsiColor.BLUE); ansiElements.put("magenta", AnsiColor.MAGENTA); ansiElements.put("cyan", AnsiColor.CYAN); - ansiElements.put("white", AnsiColor.WHITE); - ansiElements.put("black", AnsiColor.BLACK); ansiElements.put("bright_black", AnsiColor.BRIGHT_BLACK); + ansiElements.put("bright_white", AnsiColor.BRIGHT_WHITE); ansiElements.put("bright_red", AnsiColor.BRIGHT_RED); ansiElements.put("bright_green", AnsiColor.BRIGHT_GREEN); ansiElements.put("bright_yellow", AnsiColor.BRIGHT_YELLOW); ansiElements.put("bright_blue", AnsiColor.BRIGHT_BLUE); ansiElements.put("bright_magenta", AnsiColor.BRIGHT_MAGENTA); ansiElements.put("bright_cyan", AnsiColor.BRIGHT_CYAN); - ansiElements.put("bright_white", AnsiColor.BRIGHT_WHITE); ELEMENTS = Collections.unmodifiableMap(ansiElements); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ColorConverterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ColorConverterTests.java index d1a8cdd787..433c57ff15 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ColorConverterTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ColorConverterTests.java @@ -57,6 +57,20 @@ class ColorConverterTests { return ColorConverter.newInstance(null, new String[] { this.in, styling }); } + @Test + void black() { + StringBuilder output = new StringBuilder(); + newConverter("black").format(this.event, output); + assertThat(output).hasToString("\033[30min\033[0;39m"); + } + + @Test + void white() { + StringBuilder output = new StringBuilder(); + newConverter("white").format(this.event, output); + assertThat(output).hasToString("\033[37min\033[0;39m"); + } + @Test void faint() { StringBuilder output = new StringBuilder(); @@ -106,20 +120,6 @@ class ColorConverterTests { assertThat(output).hasToString("\033[36min\033[0;39m"); } - @Test - void white() { - StringBuilder output = new StringBuilder(); - newConverter("white").format(this.event, output); - assertThat(output).hasToString("\033[37min\033[0;39m"); - } - - @Test - void black() { - StringBuilder output = new StringBuilder(); - newConverter("black").format(this.event, output); - assertThat(output).hasToString("\033[30min\033[0;39m"); - } - @Test void brightBlack() { StringBuilder output = new StringBuilder(); @@ -127,6 +127,13 @@ class ColorConverterTests { assertThat(output).hasToString("\033[90min\033[0;39m"); } + @Test + void brightWhite() { + StringBuilder output = new StringBuilder(); + newConverter("bright_white").format(this.event, output); + assertThat(output).hasToString("\033[97min\033[0;39m"); + } + @Test void brightRed() { StringBuilder output = new StringBuilder(); @@ -169,13 +176,6 @@ class ColorConverterTests { assertThat(output).hasToString("\033[96min\033[0;39m"); } - @Test - void brightWhite() { - StringBuilder output = new StringBuilder(); - newConverter("bright_white").format(this.event, output); - assertThat(output).hasToString("\033[97min\033[0;39m"); - } - @Test void highlightFatal() { this.event.setLevel(Level.FATAL); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/ColorConverterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/ColorConverterTests.java index 94c0391fe7..4ce831e425 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/ColorConverterTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/ColorConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,6 +51,20 @@ class ColorConverterTests { AnsiOutput.setEnabled(AnsiOutput.Enabled.DETECT); } + @Test + void black() { + this.converter.setOptionList(Collections.singletonList("black")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[30min\033[0;39m"); + } + + @Test + void white() { + this.converter.setOptionList(Collections.singletonList("white")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[37min\033[0;39m"); + } + @Test void faint() { this.converter.setOptionList(Collections.singletonList("faint")); @@ -100,20 +114,6 @@ class ColorConverterTests { assertThat(out).isEqualTo("\033[36min\033[0;39m"); } - @Test - void white() { - this.converter.setOptionList(Collections.singletonList("white")); - String out = this.converter.transform(this.event, this.in); - assertThat(out).isEqualTo("\033[37min\033[0;39m"); - } - - @Test - void black() { - this.converter.setOptionList(Collections.singletonList("black")); - String out = this.converter.transform(this.event, this.in); - assertThat(out).isEqualTo("\033[30min\033[0;39m"); - } - @Test void brightBlack() { this.converter.setOptionList(Collections.singletonList("bright_black")); @@ -121,6 +121,13 @@ class ColorConverterTests { assertThat(out).isEqualTo("\033[90min\033[0;39m"); } + @Test + void brightWhite() { + this.converter.setOptionList(Collections.singletonList("bright_white")); + String out = this.converter.transform(this.event, this.in); + assertThat(out).isEqualTo("\033[97min\033[0;39m"); + } + @Test void brightRed() { this.converter.setOptionList(Collections.singletonList("bright_red")); @@ -163,13 +170,6 @@ class ColorConverterTests { assertThat(out).isEqualTo("\033[96min\033[0;39m"); } - @Test - void brightWhite() { - this.converter.setOptionList(Collections.singletonList("bright_white")); - String out = this.converter.transform(this.event, this.in); - assertThat(out).isEqualTo("\033[97min\033[0;39m"); - } - @Test void highlightError() { this.event.setLevel(Level.ERROR);