diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java index b916ffb55a0..defe0704e00 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java @@ -21,6 +21,7 @@ import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.pattern.ConverterKeys; import org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter; +import org.apache.logging.log4j.core.pattern.LogEventPatternConverter; import org.apache.logging.log4j.core.pattern.PatternConverter; import org.apache.logging.log4j.core.pattern.ThrowablePatternConverter; import org.jspecify.annotations.Nullable; @@ -35,25 +36,33 @@ import org.jspecify.annotations.Nullable; */ @Plugin(name = "ExtendedWhitespaceThrowablePatternConverter", category = PatternConverter.CATEGORY) @ConverterKeys({ "xwEx", "xwThrowable", "xwException" }) -public final class ExtendedWhitespaceThrowablePatternConverter extends ThrowablePatternConverter { +public final class ExtendedWhitespaceThrowablePatternConverter extends LogEventPatternConverter { private final ExtendedThrowablePatternConverter delegate; + private final String separator; + @SuppressWarnings("deprecation") // https://github.com/apache/logging-log4j2/issues/3809 private ExtendedWhitespaceThrowablePatternConverter(Configuration configuration, @Nullable String[] options) { - super("WhitespaceExtendedThrowable", "throwable", options, configuration); + super("WhitespaceExtendedThrowable", "throwable"); this.delegate = ExtendedThrowablePatternConverter.newInstance(configuration, options); + this.separator = this.delegate.getOptions().getSeparator(); } @Override public void format(LogEvent event, StringBuilder buffer) { if (event.getThrown() != null) { - buffer.append(this.options.getSeparator()); + buffer.append(this.separator); this.delegate.format(event, buffer); - buffer.append(this.options.getSeparator()); + buffer.append(this.separator); } } + @Override + public boolean handlesThrowable() { + return true; + } + /** * Creates a new instance of the class. Required by Log4J2. * @param configuration current configuration diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java index 37201f36fef..136d9bd348e 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java @@ -20,6 +20,8 @@ import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.pattern.ConverterKeys; +import org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter; +import org.apache.logging.log4j.core.pattern.LogEventPatternConverter; import org.apache.logging.log4j.core.pattern.PatternConverter; import org.apache.logging.log4j.core.pattern.ThrowablePatternConverter; import org.jspecify.annotations.Nullable; @@ -33,22 +35,33 @@ import org.jspecify.annotations.Nullable; */ @Plugin(name = "WhitespaceThrowablePatternConverter", category = PatternConverter.CATEGORY) @ConverterKeys({ "wEx", "wThrowable", "wException" }) -public final class WhitespaceThrowablePatternConverter extends ThrowablePatternConverter { +public final class WhitespaceThrowablePatternConverter extends LogEventPatternConverter { + + private final ExtendedThrowablePatternConverter delegate; + + private final String separator; @SuppressWarnings("deprecation") // https://github.com/apache/logging-log4j2/issues/3809 private WhitespaceThrowablePatternConverter(Configuration configuration, @Nullable String[] options) { - super("WhitespaceThrowable", "throwable", options, configuration); + super("WhitespaceThrowable", "throwable"); + this.delegate = ExtendedThrowablePatternConverter.newInstance(configuration, options); + this.separator = this.delegate.getOptions().getSeparator(); } @Override public void format(LogEvent event, StringBuilder buffer) { if (event.getThrown() != null) { - buffer.append(this.options.getSeparator()); - super.format(event, buffer); - buffer.append(this.options.getSeparator()); + buffer.append(this.separator); + this.delegate.format(event, buffer); + buffer.append(this.separator); } } + @Override + public boolean handlesThrowable() { + return true; + } + /** * Creates a new instance of the class. Required by Log4J2. * @param configuration current configuration diff --git a/core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java b/core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java index c316e96b0a1..b99a96e79d1 100644 --- a/core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java +++ b/core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java @@ -19,7 +19,7 @@ package org.springframework.boot.logging.log4j2; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.DefaultConfiguration; import org.apache.logging.log4j.core.impl.Log4jLogEvent; -import org.apache.logging.log4j.core.pattern.ThrowablePatternConverter; +import org.apache.logging.log4j.core.pattern.LogEventPatternConverter; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -32,7 +32,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ class ExtendedWhitespaceThrowablePatternConverterTests { - private final ThrowablePatternConverter converter = ExtendedWhitespaceThrowablePatternConverter + private final LogEventPatternConverter converter = ExtendedWhitespaceThrowablePatternConverter .newInstance(new DefaultConfiguration(), new String[] {}); @Test diff --git a/core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java b/core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java index 970176a04b2..782cbeae15e 100644 --- a/core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java +++ b/core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java @@ -19,7 +19,7 @@ package org.springframework.boot.logging.log4j2; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.DefaultConfiguration; import org.apache.logging.log4j.core.impl.Log4jLogEvent; -import org.apache.logging.log4j.core.pattern.ThrowablePatternConverter; +import org.apache.logging.log4j.core.pattern.LogEventPatternConverter; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -31,7 +31,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ class WhitespaceThrowablePatternConverterTests { - private final ThrowablePatternConverter converter = WhitespaceThrowablePatternConverter + private final LogEventPatternConverter converter = WhitespaceThrowablePatternConverter .newInstance(new DefaultConfiguration(), new String[] {}); @Test