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