diff --git a/config/checkstyle/checkstyle-suppressions.xml b/config/checkstyle/checkstyle-suppressions.xml index 482da4a39e1..30b078caeb2 100644 --- a/config/checkstyle/checkstyle-suppressions.xml +++ b/config/checkstyle/checkstyle-suppressions.xml @@ -75,4 +75,7 @@ + + + diff --git a/core/spring-boot/build.gradle b/core/spring-boot/build.gradle index 44cb7ba5066..cc64ced1a1b 100644 --- a/core/spring-boot/build.gradle +++ b/core/spring-boot/build.gradle @@ -87,6 +87,12 @@ tasks.named("checkFormatMain") { source(fileTree("src/main/javaTemplates")) } +tasks.named("compileJava") { + // Provide the project coordinates to the `GraalVmProcessor`: + options.compilerArgs << '-Alog4j.graalvm.groupId=org.springframework.boot' + options.compilerArgs << '-Alog4j.graalvm.artifactId=spring-boot-log4j' +} + plugins.withType(EclipsePlugin) { eclipse { synchronizationTasks syncJavaTemplates diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ElasticCommonSchemaStructuredLogFormatter.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ElasticCommonSchemaStructuredLogFormatter.java index 0f26973cec5..ab97f7a23e8 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ElasticCommonSchemaStructuredLogFormatter.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/ElasticCommonSchemaStructuredLogFormatter.java @@ -19,11 +19,11 @@ package org.springframework.boot.logging.log4j2; import java.util.Objects; import java.util.Set; import java.util.TreeSet; +import java.util.function.Function; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.impl.ThrowableProxy; import org.apache.logging.log4j.core.time.Instant; import org.apache.logging.log4j.util.ReadOnlyStringMap; import org.jspecify.annotations.Nullable; @@ -71,10 +71,10 @@ class ElasticCommonSchemaStructuredLogFormatter extends JsonWriterStructuredLogF members.add("message", LogEvent::getMessage).as(StructuredMessage::get); members.from(LogEvent::getContextData) .usingPairs(contextPairs.nested(ElasticCommonSchemaStructuredLogFormatter::addContextDataPairs)); - members.from(LogEvent::getThrownProxy).whenNotNull().usingMembers((thrownProxyMembers) -> { + members.from(LogEvent::getThrown).whenNotNull().usingMembers((thrownProxyMembers) -> { thrownProxyMembers.add("error").usingMembers((error) -> { - error.add("type", ThrowableProxy::getThrowable).whenNotNull().as(ObjectUtils::nullSafeClassName); - error.add("message", ThrowableProxy::getMessage); + error.add("type", Function.identity()).whenNotNull().as(ObjectUtils::nullSafeClassName); + error.add("message", Throwable::getMessage); error.add("stack_trace", extractor::stackTrace); }); }); 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 3b45bb66293..b916ffb55a0 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 @@ -39,7 +39,8 @@ public final class ExtendedWhitespaceThrowablePatternConverter extends Throwable private final ExtendedThrowablePatternConverter delegate; - private ExtendedWhitespaceThrowablePatternConverter(Configuration configuration, String @Nullable [] options) { + @SuppressWarnings("deprecation") // https://github.com/apache/logging-log4j2/issues/3809 + private ExtendedWhitespaceThrowablePatternConverter(Configuration configuration, @Nullable String[] options) { super("WhitespaceExtendedThrowable", "throwable", options, configuration); this.delegate = ExtendedThrowablePatternConverter.newInstance(configuration, options); } @@ -61,7 +62,7 @@ public final class ExtendedWhitespaceThrowablePatternConverter extends Throwable * @return a new {@code WhitespaceThrowablePatternConverter} */ public static ExtendedWhitespaceThrowablePatternConverter newInstance(Configuration configuration, - String @Nullable [] options) { + @Nullable String[] options) { return new ExtendedWhitespaceThrowablePatternConverter(configuration, options); } diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Extractor.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Extractor.java index bda41b00561..0d9fa411e6e 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Extractor.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Extractor.java @@ -16,13 +16,14 @@ package org.springframework.boot.logging.log4j2; +import java.io.PrintWriter; +import java.io.StringWriter; + import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.impl.ThrowableProxy; import org.jspecify.annotations.Nullable; import org.slf4j.event.LoggingEvent; import org.springframework.boot.logging.StackTracePrinter; -import org.springframework.util.Assert; /** * Functions to extract items from {@link LoggingEvent}. @@ -42,19 +43,23 @@ class Extractor { } @Nullable String stackTrace(LogEvent event) { - return stackTrace(event.getThrownProxy()); + return stackTrace(event.getThrown()); } - @Nullable String stackTrace(@Nullable ThrowableProxy throwableProxy) { - if (throwableProxy == null) { + @Nullable String stackTrace(@Nullable Throwable throwable) { + if (throwable == null) { return null; } if (this.stackTracePrinter != null) { - Throwable throwable = throwableProxy.getThrowable(); - Assert.state(throwable != null, "Proxy must return Throwable in order to print exception"); return this.stackTracePrinter.printStackTraceToString(throwable); } - return throwableProxy.getExtendedStackTraceAsString(); + return printStackTrace(throwable); + } + + private static String printStackTrace(Throwable throwable) { + StringWriter stringWriter = new StringWriter(); + throwable.printStackTrace(new PrintWriter(stringWriter)); + return stringWriter.toString(); } } diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/GraylogExtendedLogFormatStructuredLogFormatter.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/GraylogExtendedLogFormatStructuredLogFormatter.java index 39602890819..d7026150f4f 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/GraylogExtendedLogFormatStructuredLogFormatter.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/GraylogExtendedLogFormatStructuredLogFormatter.java @@ -98,8 +98,8 @@ class GraylogExtendedLogFormatStructuredLogFormatter extends JsonWriterStructure .usingPairs(contextPairs.flat(additionalFieldJoiner(), GraylogExtendedLogFormatStructuredLogFormatter::addContextDataPairs)); members.add() - .whenNotNull(LogEvent::getThrownProxy) - .usingMembers((thrownProxyMembers) -> throwableMembers(thrownProxyMembers, extractor)); + .whenNotNull(LogEvent::getThrown) + .usingMembers((thrownMembers) -> throwableMembers(thrownMembers, extractor)); } private static String getMessageText(Message message) { @@ -131,11 +131,9 @@ class GraylogExtendedLogFormatStructuredLogFormatter extends JsonWriterStructure private static void throwableMembers(Members members, Extractor extractor) { members.add("full_message", extractor::messageAndStackTrace); - members.add("_error_type", (event) -> event.getThrownProxy().getThrowable()) - .whenNotNull() - .as(ObjectUtils::nullSafeClassName); + members.add("_error_type", LogEvent::getThrown).whenNotNull().as(ObjectUtils::nullSafeClassName); members.add("_error_stack_trace", extractor::stackTrace); - members.add("_error_message", (event) -> event.getThrownProxy().getMessage()); + members.add("_error_message", (event) -> event.getThrown().getMessage()); } private static void addContextDataPairs(ContextPairs.Pairs contextPairs) { diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/LogstashStructuredLogFormatter.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/LogstashStructuredLogFormatter.java index cbd2d70254f..85321ce74a6 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/LogstashStructuredLogFormatter.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/LogstashStructuredLogFormatter.java @@ -68,7 +68,7 @@ class LogstashStructuredLogFormatter extends JsonWriterStructuredLogFormatter