Skip to content

Commit dcd09d2

Browse files
committed
Change SpringBootTriggeringPolicy to Abstract Class
Signed-off-by: hojooo <ghwn5833@gmail.com>
1 parent ad04ebb commit dcd09d2

File tree

3 files changed

+30
-106
lines changed

3 files changed

+30
-106
lines changed

core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/SpringBootTriggeringPolicy.java

Lines changed: 12 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,7 @@
1616

1717
package org.springframework.boot.logging.log4j2;
1818

19-
import java.util.concurrent.TimeUnit;
20-
21-
import org.apache.logging.log4j.core.LifeCycle;
22-
import org.apache.logging.log4j.core.LifeCycle2;
2319
import org.apache.logging.log4j.core.LogEvent;
24-
import org.apache.logging.log4j.core.appender.rolling.AbstractTriggeringPolicy;
2520
import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy;
2621
import org.apache.logging.log4j.core.appender.rolling.CronTriggeringPolicy;
2722
import org.apache.logging.log4j.core.appender.rolling.RollingFileManager;
@@ -34,105 +29,45 @@
3429
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
3530
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
3631
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
37-
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
3832
import org.apache.logging.log4j.core.util.Builder;
3933
import org.jspecify.annotations.Nullable;
4034

4135
import org.springframework.util.Assert;
4236

4337
/**
44-
* {@link TriggeringPolicy} that selects one of several standard Log4j2
45-
* {@link TriggeringPolicy TriggeringPolicies} based on configuration attributes. The
46-
* supported strategies are {@code size}, {@code time}, {@code size-and-time}, and
47-
* {@code cron}.
38+
* Factory for creating a standard Log4j2 {@link TriggeringPolicy} based on configuration
39+
* attributes. The supported strategies are {@code size}, {@code time},
40+
* {@code size-and-time}, and {@code cron}.
4841
*
4942
* @author HoJoo Moon
5043
* @since 4.0.0
5144
*/
5245
@Plugin(name = "SpringBootTriggeringPolicy", category = Node.CATEGORY, elementType = "TriggeringPolicy",
5346
deferChildren = true, printObject = true)
54-
public final class SpringBootTriggeringPolicy extends AbstractTriggeringPolicy {
55-
56-
private final TriggeringPolicy delegate;
57-
58-
private SpringBootTriggeringPolicy(TriggeringPolicy delegate) {
59-
this.delegate = delegate;
60-
}
47+
public abstract class SpringBootTriggeringPolicy implements TriggeringPolicy {
6148

62-
TriggeringPolicy getDelegate() {
63-
return this.delegate;
49+
private SpringBootTriggeringPolicy() {
6450
}
6551

6652
@Override
6753
public void initialize(RollingFileManager manager) {
68-
this.delegate.initialize(manager);
69-
}
70-
71-
@Override
72-
public boolean isTriggeringEvent(LogEvent event) {
73-
return this.delegate.isTriggeringEvent(event);
74-
}
75-
76-
@Override
77-
public void start() {
78-
super.start();
79-
if (this.delegate instanceof LifeCycle lifecycle) {
80-
lifecycle.start();
81-
}
54+
throw new UnsupportedOperationException("This class should not be instantiated");
8255
}
8356

8457
@Override
85-
public boolean stop(long timeout, TimeUnit timeUnit) {
86-
setStopping();
87-
boolean result = true;
88-
if (this.delegate instanceof LifeCycle2 lifecycle2) {
89-
result = lifecycle2.stop(timeout, timeUnit);
90-
}
91-
else if (this.delegate instanceof LifeCycle lifecycle) {
92-
lifecycle.stop();
93-
}
94-
setStopped();
95-
return result;
96-
}
97-
98-
@Override
99-
public boolean isStarted() {
100-
if (this.delegate instanceof LifeCycle lifecycle) {
101-
return lifecycle.isStarted();
102-
}
103-
return super.isStarted();
104-
}
105-
106-
@Override
107-
public String toString() {
108-
return "SpringBootTriggeringPolicy{" + this.delegate + "}";
58+
public boolean isTriggeringEvent(LogEvent logEvent) {
59+
throw new UnsupportedOperationException("This class should not be instantiated");
10960
}
11061

11162
@PluginBuilderFactory
11263
public static SpringBootTriggeringPolicyBuilder newBuilder() {
11364
return new SpringBootTriggeringPolicyBuilder();
11465
}
11566

116-
@PluginFactory
117-
public static SpringBootTriggeringPolicy createPolicy(@PluginAttribute("strategy") @Nullable String strategy,
118-
@PluginAttribute("maxFileSize") @Nullable String maxFileSize,
119-
@PluginAttribute("timeInterval") @Nullable Integer timeInterval,
120-
@PluginAttribute("timeModulate") @Nullable Boolean timeModulate,
121-
@PluginAttribute("cronExpression") @Nullable String cronExpression,
122-
@PluginConfiguration Configuration configuration) {
123-
return newBuilder().setStrategy(strategy)
124-
.setMaxFileSize(maxFileSize)
125-
.setTimeInterval(timeInterval)
126-
.setTimeModulate(timeModulate)
127-
.setCronExpression(cronExpression)
128-
.setConfiguration(configuration)
129-
.build();
130-
}
131-
13267
/**
133-
* Builder for {@link SpringBootTriggeringPolicy}.
68+
* Builder for creating a {@link TriggeringPolicy}.
13469
*/
135-
public static class SpringBootTriggeringPolicyBuilder implements Builder<SpringBootTriggeringPolicy> {
70+
public static class SpringBootTriggeringPolicyBuilder implements Builder<TriggeringPolicy> {
13671

13772
private static final String DEFAULT_STRATEGY = "size";
13873

@@ -161,21 +96,20 @@ public static class SpringBootTriggeringPolicyBuilder implements Builder<SpringB
16196
private @Nullable Configuration configuration;
16297

16398
@Override
164-
public SpringBootTriggeringPolicy build() {
99+
public TriggeringPolicy build() {
165100
// Read strategy from system properties first, then from attributes
166101
String resolvedStrategy = System.getProperty("LOG4J2_ROLLINGPOLICY_STRATEGY");
167102
if (resolvedStrategy == null) {
168103
resolvedStrategy = (this.strategy != null) ? this.strategy : DEFAULT_STRATEGY;
169104
}
170-
TriggeringPolicy policy = switch (resolvedStrategy) {
105+
return switch (resolvedStrategy) {
171106
case "time" -> createTimePolicy();
172107
case "size-and-time" -> CompositeTriggeringPolicy.createPolicy(createSizePolicy(), createTimePolicy());
173108
case "cron" -> createCronPolicy();
174109
case "size" -> createSizePolicy();
175110
default -> throw new IllegalArgumentException(
176111
"Unsupported rolling policy strategy '%s'".formatted(resolvedStrategy));
177112
};
178-
return new SpringBootTriggeringPolicy(policy);
179113
}
180114

181115
private TriggeringPolicy createSizePolicy() {

core/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-file.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,7 @@
4141
timeModulate="${sys:LOG4J2_ROLLINGPOLICY_TIME_MODULATE:-false}"
4242
cronExpression="${sys:LOG4J2_ROLLINGPOLICY_CRON_SCHEDULE}"/>
4343
</Policies>
44-
<DefaultRolloverStrategy max="${sys:LOG4J2_ROLLINGPOLICY_MAX_HISTORY:-7}"
45-
cleanHistoryOnStart="${sys:LOG4J2_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}"
46-
totalSizeCap="${sys:LOG4J2_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}"/>
44+
<DefaultRolloverStrategy max="${sys:LOG4J2_ROLLINGPOLICY_MAX_HISTORY:-7}"/>
4745
</RollingFile>
4846
</Appenders>
4947
<Loggers>

core/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -820,10 +820,9 @@ void rollingPolicyDeprecatedPropertiesAreApplied() {
820820
void rollingPolicyTimeStrategyIsApplied() {
821821
this.environment.setProperty("logging.log4j2.rollingpolicy.strategy", "time");
822822
this.environment.setProperty("logging.log4j2.rollingpolicy.time-based.interval", "2");
823-
SpringBootTriggeringPolicy policy = getTriggeringPolicy();
824-
TriggeringPolicy delegate = policy.getDelegate();
825-
assertThat(delegate).isInstanceOf(TimeBasedTriggeringPolicy.class);
826-
TimeBasedTriggeringPolicy timePolicy = (TimeBasedTriggeringPolicy) delegate;
823+
TriggeringPolicy policy = getTriggeringPolicy();
824+
TimeBasedTriggeringPolicy timePolicy = findPolicy(policy, TimeBasedTriggeringPolicy.class);
825+
assertThat(timePolicy).isNotNull();
827826
assertThat(timePolicy.getInterval()).isEqualTo(2);
828827
}
829828

@@ -832,49 +831,42 @@ void rollingPolicySizeAndTimeStrategyIsApplied() {
832831
this.environment.setProperty("logging.log4j2.rollingpolicy.strategy", "size-and-time");
833832
this.environment.setProperty("logging.log4j2.rollingpolicy.max-file-size", "5MB");
834833
this.environment.setProperty("logging.log4j2.rollingpolicy.time-based.interval", "3");
835-
SpringBootTriggeringPolicy policy = getTriggeringPolicy();
836-
TriggeringPolicy delegate = policy.getDelegate();
837-
assertThat(delegate).isInstanceOf(CompositeTriggeringPolicy.class);
838-
CompositeTriggeringPolicy composite = (CompositeTriggeringPolicy) delegate;
839-
TriggeringPolicy[] policies = composite.getTriggeringPolicies();
840-
assertThat(policies).anyMatch(TimeBasedTriggeringPolicy.class::isInstance);
841-
assertThat(policies).anyMatch(SizeBasedTriggeringPolicy.class::isInstance);
834+
TriggeringPolicy policy = getTriggeringPolicy();
835+
assertThat(findPolicy(policy, TimeBasedTriggeringPolicy.class)).isNotNull();
836+
assertThat(findPolicy(policy, SizeBasedTriggeringPolicy.class)).isNotNull();
842837
}
843838

844839
@Test
845840
void rollingPolicyCronStrategyIsApplied() {
846841
this.environment.setProperty("logging.log4j2.rollingpolicy.strategy", "cron");
847842
this.environment.setProperty("logging.log4j2.rollingpolicy.cron.schedule", "0 0 0 * * ?");
848-
SpringBootTriggeringPolicy policy = getTriggeringPolicy();
849-
TriggeringPolicy delegate = policy.getDelegate();
850-
assertThat(delegate).isInstanceOf(CronTriggeringPolicy.class);
851-
CronTriggeringPolicy cronPolicy = (CronTriggeringPolicy) delegate;
843+
TriggeringPolicy policy = getTriggeringPolicy();
844+
CronTriggeringPolicy cronPolicy = findPolicy(policy, CronTriggeringPolicy.class);
845+
assertThat(cronPolicy).isNotNull();
852846
assertThat(cronPolicy.getCronExpression().getCronExpression()).isEqualTo("0 0 0 * * ?");
853847
}
854848

855-
private SpringBootTriggeringPolicy getTriggeringPolicy() {
849+
private TriggeringPolicy getTriggeringPolicy() {
856850
File file = new File(tmpDir(), "target-file.log");
857851
LogFile logFile = getLogFile(file.getPath(), null);
858852
this.loggingSystem.beforeInitialize();
859853
this.loggingSystem.initialize(this.initializationContext,
860854
"classpath:org/springframework/boot/logging/log4j2/log4j2-file.xml", logFile);
861-
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
855+
LoggerContext loggerContext = this.loggingSystem.getLoggerContext();
862856
Configuration configuration = loggerContext.getConfiguration();
863857
RollingFileAppender appender = (RollingFileAppender) configuration.getAppenders().get("File");
864858
assertThat(appender).isNotNull();
865-
TriggeringPolicy topPolicy = appender.getManager().getTriggeringPolicy();
866-
SpringBootTriggeringPolicy policy = findSpringBootTriggeringPolicy(topPolicy);
867-
assertThat(policy).isNotNull();
868-
return policy;
859+
return appender.getManager().getTriggeringPolicy();
869860
}
870861

871-
private @Nullable SpringBootTriggeringPolicy findSpringBootTriggeringPolicy(TriggeringPolicy policy) {
872-
if (policy instanceof SpringBootTriggeringPolicy springBoot) {
873-
return springBoot;
862+
@SuppressWarnings("unchecked")
863+
private <T extends TriggeringPolicy> @Nullable T findPolicy(TriggeringPolicy policy, Class<T> type) {
864+
if (type.isInstance(policy)) {
865+
return (T) policy;
874866
}
875867
if (policy instanceof CompositeTriggeringPolicy composite) {
876868
for (TriggeringPolicy child : composite.getTriggeringPolicies()) {
877-
SpringBootTriggeringPolicy found = findSpringBootTriggeringPolicy(child);
869+
T found = findPolicy(child, type);
878870
if (found != null) {
879871
return found;
880872
}

0 commit comments

Comments
 (0)