diff --git a/config/checkstyle/checkstyle-suppressions.xml b/config/checkstyle/checkstyle-suppressions.xml
index a5b760bf19b..866affcf169 100644
--- a/config/checkstyle/checkstyle-suppressions.xml
+++ b/config/checkstyle/checkstyle-suppressions.xml
@@ -84,4 +84,5 @@
+
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 8989ebcf3a1..1e9b7fcd59b 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
@@ -49,8 +49,9 @@ import org.springframework.util.ObjectUtils;
class ElasticCommonSchemaStructuredLogFormatter extends JsonWriterStructuredLogFormatter {
ElasticCommonSchemaStructuredLogFormatter(Environment environment, StackTracePrinter stackTracePrinter,
- ContextPairs contextPairs, StructuredLoggingJsonMembersCustomizer> customizer) {
- super((members) -> jsonMembers(environment, stackTracePrinter, contextPairs, members), customizer);
+ ContextPairs contextPairs, StructuredLoggingJsonMembersCustomizer.Builder> customizerBuilder) {
+ super((members) -> jsonMembers(environment, stackTracePrinter, contextPairs, members),
+ customizerBuilder.nested().build());
}
private static void jsonMembers(Environment environment, StackTracePrinter stackTracePrinter,
diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/StructuredLogLayout.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/StructuredLogLayout.java
index eff5894ba7c..ab94016d5c0 100644
--- a/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/StructuredLogLayout.java
+++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/StructuredLogLayout.java
@@ -115,10 +115,10 @@ final class StructuredLogLayout extends AbstractStringLayout {
Environment environment = instantiator.getArg(Environment.class);
StackTracePrinter stackTracePrinter = instantiator.getArg(StackTracePrinter.class);
ContextPairs contextPairs = instantiator.getArg(ContextPairs.class);
- StructuredLoggingJsonMembersCustomizer> jsonMembersCustomizer = instantiator
- .getArg(StructuredLoggingJsonMembersCustomizer.class);
+ StructuredLoggingJsonMembersCustomizer.Builder> jsonMembersCustomizerBuilder = instantiator
+ .getArg(StructuredLoggingJsonMembersCustomizer.Builder.class);
return new ElasticCommonSchemaStructuredLogFormatter(environment, stackTracePrinter, contextPairs,
- jsonMembersCustomizer);
+ jsonMembersCustomizerBuilder);
}
private GraylogExtendedLogFormatStructuredLogFormatter createGraylogFormatter(Instantiator> instantiator) {
diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/logback/ElasticCommonSchemaStructuredLogFormatter.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/logback/ElasticCommonSchemaStructuredLogFormatter.java
index 61f62933a9a..f952b1518e2 100644
--- a/core/spring-boot/src/main/java/org/springframework/boot/logging/logback/ElasticCommonSchemaStructuredLogFormatter.java
+++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/logback/ElasticCommonSchemaStructuredLogFormatter.java
@@ -53,9 +53,9 @@ class ElasticCommonSchemaStructuredLogFormatter extends JsonWriterStructuredLogF
ElasticCommonSchemaStructuredLogFormatter(Environment environment, StackTracePrinter stackTracePrinter,
ContextPairs contextPairs, ThrowableProxyConverter throwableProxyConverter,
- StructuredLoggingJsonMembersCustomizer> customizer) {
+ StructuredLoggingJsonMembersCustomizer.Builder> customizerBuilder) {
super((members) -> jsonMembers(environment, stackTracePrinter, contextPairs, throwableProxyConverter, members),
- customizer);
+ customizerBuilder.nested().build());
}
private static void jsonMembers(Environment environment, StackTracePrinter stackTracePrinter,
diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/logback/StructuredLogEncoder.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/logback/StructuredLogEncoder.java
index a78e835a52d..3524be0c102 100644
--- a/core/spring-boot/src/main/java/org/springframework/boot/logging/logback/StructuredLogEncoder.java
+++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/logback/StructuredLogEncoder.java
@@ -93,10 +93,10 @@ public class StructuredLogEncoder extends EncoderBase {
StackTracePrinter stackTracePrinter = instantiator.getArg(StackTracePrinter.class);
ContextPairs contextParis = instantiator.getArg(ContextPairs.class);
ThrowableProxyConverter throwableProxyConverter = instantiator.getArg(ThrowableProxyConverter.class);
- StructuredLoggingJsonMembersCustomizer> jsonMembersCustomizer = instantiator
- .getArg(StructuredLoggingJsonMembersCustomizer.class);
+ StructuredLoggingJsonMembersCustomizer.Builder> jsonMembersCustomizerBuilder = instantiator
+ .getArg(StructuredLoggingJsonMembersCustomizer.Builder.class);
return new ElasticCommonSchemaStructuredLogFormatter(environment, stackTracePrinter, contextParis,
- throwableProxyConverter, jsonMembersCustomizer);
+ throwableProxyConverter, jsonMembersCustomizerBuilder);
}
private StructuredLogFormatter createGraylogFormatter(Instantiator> instantiator) {
diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLogFormatter.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLogFormatter.java
index 0bde5f83c24..209b70f1281 100644
--- a/core/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLogFormatter.java
+++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLogFormatter.java
@@ -28,6 +28,7 @@ import org.springframework.core.env.Environment;
*
* - {@link Environment}
* - {@link StructuredLoggingJsonMembersCustomizer}
+ * - {@link StructuredLoggingJsonMembersCustomizer.Builder}
* - {@link StackTracePrinter} (may be {@code null})
* - {@link ContextPairs}
*
diff --git a/core/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLogFormatterFactory.java b/core/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLogFormatterFactory.java
index 18c95a463fd..3d56c441c07 100644
--- a/core/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLogFormatterFactory.java
+++ b/core/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLogFormatterFactory.java
@@ -29,6 +29,7 @@ import org.springframework.boot.logging.structured.StructuredLoggingJsonProperti
import org.springframework.boot.util.Instantiator;
import org.springframework.boot.util.Instantiator.AvailableParameters;
import org.springframework.boot.util.Instantiator.FailureHandler;
+import org.springframework.boot.util.LambdaSafe;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.SpringFactoriesLoader;
@@ -85,7 +86,9 @@ public class StructuredLogFormatterFactory {
this.instantiator = new Instantiator<>(Object.class, (allAvailableParameters) -> {
allAvailableParameters.add(Environment.class, environment);
allAvailableParameters.add(StructuredLoggingJsonMembersCustomizer.class,
- (type) -> getStructuredLoggingJsonMembersCustomizer(properties));
+ new JsonMembersCustomizerBuilder(properties).build());
+ allAvailableParameters.add(StructuredLoggingJsonMembersCustomizer.Builder.class,
+ new JsonMembersCustomizerBuilder(properties));
allAvailableParameters.add(StackTracePrinter.class, (type) -> getStackTracePrinter(properties));
allAvailableParameters.add(ContextPairs.class, (type) -> getContextPairs(properties));
if (availableParameters != null) {
@@ -96,30 +99,6 @@ public class StructuredLogFormatterFactory {
commonFormatters.accept(this.commonFormatters);
}
- StructuredLoggingJsonMembersCustomizer> getStructuredLoggingJsonMembersCustomizer(
- StructuredLoggingJsonProperties properties) {
- List> customizers = new ArrayList<>();
- if (properties != null) {
- customizers.add(new StructuredLoggingJsonPropertiesJsonMembersCustomizer(this.instantiator, properties));
- }
- customizers.addAll(loadStructuredLoggingJsonMembersCustomizers());
- return (members) -> invokeCustomizers(customizers, members);
- }
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- private List> loadStructuredLoggingJsonMembersCustomizers() {
- return (List) this.factoriesLoader.load(StructuredLoggingJsonMembersCustomizer.class,
- ArgumentResolver.from(this.instantiator::getArg));
- }
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- private void invokeCustomizers(List> customizers,
- Members