vy commented on issue #3809: URL: https://github.com/apache/logging-log4j2/issues/3809#issuecomment-3052824395
> > could you use composition instead? > > I am not sure we can use composition considering we're overriding `ThrowablePatternConverter#format`. Perhaps you can have a look to our [pattern converters](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2)? @snicoll, see the following: ```diff Index: spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java =================================================================== diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java (revision 04d071046d5bdd52c40d5f91c83fa6395762f8af) +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverterTests.java (date 1752069087378) @@ -19,7 +19,7 @@ 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 @@ */ class ExtendedWhitespaceThrowablePatternConverterTests { - private final ThrowablePatternConverter converter = ExtendedWhitespaceThrowablePatternConverter + private final LogEventPatternConverter converter = ExtendedWhitespaceThrowablePatternConverter .newInstance(new DefaultConfiguration(), new String[] {}); @Test Index: spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java =================================================================== diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java (revision 04d071046d5bdd52c40d5f91c83fa6395762f8af) +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverterTests.java (date 1752069087386) @@ -19,7 +19,7 @@ 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 @@ */ class WhitespaceThrowablePatternConverterTests { - private final ThrowablePatternConverter converter = WhitespaceThrowablePatternConverter + private final LogEventPatternConverter converter = WhitespaceThrowablePatternConverter .newInstance(new DefaultConfiguration(), new String[] {}); @Test Index: spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java =================================================================== diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java (revision 04d071046d5bdd52c40d5f91c83fa6395762f8af) +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ExtendedWhitespaceThrowablePatternConverter.java (date 1752069900762) @@ -21,6 +21,7 @@ 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; @@ -34,21 +35,24 @@ */ @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 LogEventPatternConverter delegate; + + private final String separator; private ExtendedWhitespaceThrowablePatternConverter(Configuration configuration, String[] options) { - super("WhitespaceExtendedThrowable", "throwable", options, configuration); + super("WhitespaceExtendedThrowable", "throwable"); this.delegate = ExtendedThrowablePatternConverter.newInstance(configuration, options); + this.separator = WhitespaceThrowablePatternConverter.readSeparatorOption(options); } @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); } } Index: spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java =================================================================== diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java (revision 04d071046d5bdd52c40d5f91c83fa6395762f8af) +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/WhitespaceThrowablePatternConverter.java (date 1752069900778) @@ -20,6 +20,8 @@ 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; @@ -32,18 +34,24 @@ */ @Plugin(name = "WhitespaceThrowablePatternConverter", category = PatternConverter.CATEGORY) @ConverterKeys({ "wEx", "wThrowable", "wException" }) -public final class WhitespaceThrowablePatternConverter extends ThrowablePatternConverter { +public final class WhitespaceThrowablePatternConverter extends LogEventPatternConverter { + + private final LogEventPatternConverter delegate; + + private final String separator; private WhitespaceThrowablePatternConverter(Configuration configuration, String[] options) { - super("WhitespaceThrowable", "throwable", options, configuration); + super("WhitespaceThrowable", "throwable"); + this.delegate = ExtendedThrowablePatternConverter.newInstance(configuration, options); + this.separator = readSeparatorOption(options); } @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); } } @@ -58,4 +66,15 @@ return new WhitespaceThrowablePatternConverter(configuration, options); } + static String readSeparatorOption(String[] options) { + if (options != null) { + for (String option : options) { + if (option != null && option.startsWith("separator(") && option.endsWith(")")) { + return option.substring("separator(".length(), option.length() - 1); + } + } + } + return System.lineSeparator(); + } + } ``` @ppkarwasz, would you mind proof-reading the above patch, please? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@logging.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org