Skip to content

Commit aa5d8ec

Browse files
quaffphilwebb
authored andcommitted
Add support for multiple StructuredLoggingJsonMembersCustomizers
Update `StructuredLoggingJsonProperties` and related class so that multiple `StructuredLoggingJsonMembersCustomizer` classes can be used. Signed-off-by: Yanming Zhou <[email protected]> See gh-43368
1 parent 7fd4801 commit aa5d8ec

File tree

6 files changed

+50
-13
lines changed

6 files changed

+50
-13
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLoggingJsonMembersCustomizerBeanFactoryInitializationAotProcessor.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.logging.structured;
1818

1919
import java.util.Optional;
20+
import java.util.Set;
2021

2122
import org.springframework.aot.generate.GenerationContext;
2223
import org.springframework.aot.hint.MemberCategory;
@@ -32,6 +33,7 @@
3233
* {@link StructuredLoggingJsonPropertiesJsonMembersCustomizer}.
3334
*
3435
* @author Dmytro Nosan
36+
* @author Yanming Zhou
3537
*/
3638
class StructuredLoggingJsonMembersCustomizerBeanFactoryInitializationAotProcessor
3739
implements BeanFactoryInitializationAotProcessor {
@@ -49,19 +51,19 @@ public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableL
4951

5052
private static final class AotContribution implements BeanFactoryInitializationAotContribution {
5153

52-
private final Class<? extends StructuredLoggingJsonMembersCustomizer<?>> customizer;
54+
private final Set<Class<? extends StructuredLoggingJsonMembersCustomizer<?>>> customizer;
5355

54-
private AotContribution(Class<? extends StructuredLoggingJsonMembersCustomizer<?>> customizer) {
56+
private AotContribution(Set<Class<? extends StructuredLoggingJsonMembersCustomizer<?>>> customizer) {
5557
this.customizer = customizer;
5658
}
5759

5860
@Override
5961
public void applyTo(GenerationContext generationContext,
6062
BeanFactoryInitializationCode beanFactoryInitializationCode) {
61-
generationContext.getRuntimeHints()
63+
this.customizer.forEach((it) -> generationContext.getRuntimeHints()
6264
.reflection()
63-
.registerType(this.customizer, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
64-
MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS);
65+
.registerType(it, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
66+
MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS));
6567
}
6668

6769
}

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLoggingJsonProperties.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@
3333
* @param customizer the fully qualified name of a
3434
* {@link StructuredLoggingJsonMembersCustomizer}
3535
* @author Phillip Webb
36+
* @author Yanming Zhou
3637
*/
3738
record StructuredLoggingJsonProperties(Set<String> include, Set<String> exclude, Map<String, String> rename,
38-
Map<String, String> add, Class<? extends StructuredLoggingJsonMembersCustomizer<?>> customizer) {
39+
Map<String, String> add, Set<Class<? extends StructuredLoggingJsonMembersCustomizer<?>>> customizer) {
3940

4041
static StructuredLoggingJsonProperties get(Environment environment) {
4142
return Binder.get(environment)

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/structured/StructuredLoggingJsonPropertiesJsonMembersCustomizer.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.logging.structured;
1818

1919
import java.util.Map;
20+
import java.util.Set;
2021

2122
import org.springframework.boot.json.JsonWriter.MemberPath;
2223
import org.springframework.boot.json.JsonWriter.Members;
@@ -28,6 +29,7 @@
2829
* {@link StructuredLoggingJsonProperties}.
2930
*
3031
* @author Phillip Webb
32+
* @author Yanming Zhou
3133
*/
3234
class StructuredLoggingJsonPropertiesJsonMembersCustomizer implements StructuredLoggingJsonMembersCustomizer<Object> {
3335

@@ -49,9 +51,9 @@ public void customize(Members<Object> members) {
4951
if (!CollectionUtils.isEmpty(add)) {
5052
add.forEach(members::add);
5153
}
52-
Class<? extends StructuredLoggingJsonMembersCustomizer<?>> customizer = this.properties.customizer();
54+
Set<Class<? extends StructuredLoggingJsonMembersCustomizer<?>>> customizer = this.properties.customizer();
5355
if (customizer != null) {
54-
createAndApplyCustomizer(members, customizer);
56+
customizer.forEach((c) -> createAndApplyCustomizer(members, c));
5557
}
5658
}
5759

spring-boot-project/spring-boot/src/main/resources/META-INF/additional-spring-configuration-metadata.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,8 @@
268268
},
269269
{
270270
"name": "logging.structured.json.customizer",
271-
"type": "java.lang.Class<? extends org.springframework.boot.logging.structured.StructuredLoggingJsonMembersCustomizer<?>>",
272-
"description": "The fully qualified class name of a StructuredLoggingJsonMembersCustomizer"
271+
"type": "java.util.Set<java.lang.Class<? extends org.springframework.boot.logging.structured.StructuredLoggingJsonMembersCustomizer<?>>>",
272+
"description": "The fully qualified class names of a StructuredLoggingJsonMembersCustomizer"
273273
},
274274
{
275275
"name": "logging.structured.json.exclude",

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/structured/StructuredLoggingJsonPropertiesJsonMembersCustomizerTests.java

+33-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
* Tests for {@link StructuredLoggingJsonPropertiesJsonMembersCustomizer}.
3838
*
3939
* @author Phillip Webb
40+
* @author Yanming Zhou
4041
*/
4142
@ExtendWith(MockitoExtension.class)
4243
class StructuredLoggingJsonPropertiesJsonMembersCustomizerTests {
@@ -102,12 +103,25 @@ void customizeWhenHasCustomizerCustomizesMember() {
102103
.applyingNameProcessor(NameProcessor.of(String::toUpperCase));
103104
given(((Instantiator) this.instantiator).instantiateType(TestCustomizer.class)).willReturn(uppercaseCustomizer);
104105
StructuredLoggingJsonProperties properties = new StructuredLoggingJsonProperties(Collections.emptySet(),
105-
Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), TestCustomizer.class);
106+
Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), Set.of(TestCustomizer.class));
106107
StructuredLoggingJsonPropertiesJsonMembersCustomizer customizer = new StructuredLoggingJsonPropertiesJsonMembersCustomizer(
107108
this.instantiator, properties);
108109
assertThat(writeSampleJson(customizer)).contains("\"A\":\"a\"");
109110
}
110111

112+
@Test
113+
@SuppressWarnings({ "rawtypes", "unchecked" })
114+
void multipleCustomizers() {
115+
given(((Instantiator) this.instantiator).instantiateType(FooCustomizer.class)).willReturn(new FooCustomizer());
116+
given(((Instantiator) this.instantiator).instantiateType(BarCustomizer.class)).willReturn(new BarCustomizer());
117+
StructuredLoggingJsonProperties properties = new StructuredLoggingJsonProperties(Collections.emptySet(),
118+
Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(),
119+
Set.of(FooCustomizer.class, BarCustomizer.class));
120+
StructuredLoggingJsonPropertiesJsonMembersCustomizer customizer = new StructuredLoggingJsonPropertiesJsonMembersCustomizer(
121+
this.instantiator, properties);
122+
assertThat(writeSampleJson(customizer)).contains("\"foo\":\"foo\"").contains("\"bar\":\"bar\"");
123+
}
124+
111125
@SuppressWarnings({ "rawtypes", "unchecked" })
112126
private String writeSampleJson(StructuredLoggingJsonMembersCustomizer customizer) {
113127
return JsonWriter.of((members) -> {
@@ -126,4 +140,22 @@ public void customize(Members<String> members) {
126140

127141
}
128142

143+
static class FooCustomizer implements StructuredLoggingJsonMembersCustomizer<String> {
144+
145+
@Override
146+
public void customize(Members<String> members) {
147+
members.add("foo", "foo");
148+
}
149+
150+
}
151+
152+
static class BarCustomizer implements StructuredLoggingJsonMembersCustomizer<String> {
153+
154+
@Override
155+
public void customize(Members<String> members) {
156+
members.add("bar", "bar");
157+
}
158+
159+
}
160+
129161
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/structured/StructuredLoggingJsonPropertiesTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ void getBindsFromEnvironment() {
4848
environment.setProperty("logging.structured.json.customizer", TestCustomizer.class.getName());
4949
StructuredLoggingJsonProperties properties = StructuredLoggingJsonProperties.get(environment);
5050
assertThat(properties).isEqualTo(new StructuredLoggingJsonProperties(Set.of("a", "b"), Set.of("c", "d"),
51-
Map.of("e", "f"), Map.of("g", "h"), TestCustomizer.class));
51+
Map.of("e", "f"), Map.of("g", "h"), Set.of(TestCustomizer.class)));
5252
}
5353

5454
@Test
@@ -64,7 +64,7 @@ void shouldRegisterRuntimeHints() throws Exception {
6464
assertThat(RuntimeHintsPredicates.reflection().onType(StructuredLoggingJsonProperties.class)).accepts(hints);
6565
assertThat(RuntimeHintsPredicates.reflection()
6666
.onConstructor(StructuredLoggingJsonProperties.class.getDeclaredConstructor(Set.class, Set.class, Map.class,
67-
Map.class, Class.class))
67+
Map.class, Set.class))
6868
.invoke()).accepts(hints);
6969
}
7070

0 commit comments

Comments
 (0)