10 changed files with 731 additions and 34 deletions
@ -0,0 +1,125 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-present the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.logging.log4j2; |
||||||
|
|
||||||
|
import java.util.function.BiConsumer; |
||||||
|
import java.util.function.Function; |
||||||
|
|
||||||
|
import org.jspecify.annotations.Nullable; |
||||||
|
|
||||||
|
import org.springframework.boot.logging.LogFile; |
||||||
|
import org.springframework.boot.logging.LoggingSystemProperties; |
||||||
|
import org.springframework.core.convert.ConversionFailedException; |
||||||
|
import org.springframework.core.convert.ConverterNotFoundException; |
||||||
|
import org.springframework.core.env.Environment; |
||||||
|
import org.springframework.core.env.PropertyResolver; |
||||||
|
import org.springframework.util.unit.DataSize; |
||||||
|
|
||||||
|
/** |
||||||
|
* {@link LoggingSystemProperties} for Log4j2. |
||||||
|
* |
||||||
|
* @author HoJoo Moon |
||||||
|
* @since 4.0.0 |
||||||
|
* @see Log4j2RollingPolicySystemProperty |
||||||
|
*/ |
||||||
|
public class Log4j2LoggingSystemProperties extends LoggingSystemProperties { |
||||||
|
|
||||||
|
public Log4j2LoggingSystemProperties(Environment environment) { |
||||||
|
super(environment); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a new {@link Log4j2LoggingSystemProperties} instance. |
||||||
|
* @param environment the source environment |
||||||
|
* @param setter setter used to apply the property |
||||||
|
*/ |
||||||
|
public Log4j2LoggingSystemProperties(Environment environment, |
||||||
|
@Nullable BiConsumer<String, @Nullable String> setter) { |
||||||
|
super(environment, setter); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a new {@link Log4j2LoggingSystemProperties} instance. |
||||||
|
* @param environment the source environment |
||||||
|
* @param defaultValueResolver function used to resolve default values or {@code null} |
||||||
|
* @param setter setter used to apply the property or {@code null} for system |
||||||
|
* properties |
||||||
|
*/ |
||||||
|
public Log4j2LoggingSystemProperties(Environment environment, |
||||||
|
Function<@Nullable String, @Nullable String> defaultValueResolver, |
||||||
|
@Nullable BiConsumer<String, @Nullable String> setter) { |
||||||
|
super(environment, defaultValueResolver, setter); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void apply(@Nullable LogFile logFile, PropertyResolver resolver) { |
||||||
|
super.apply(logFile, resolver); |
||||||
|
applyRollingPolicyProperties(resolver); |
||||||
|
} |
||||||
|
|
||||||
|
private void applyRollingPolicyProperties(PropertyResolver resolver) { |
||||||
|
applyRollingPolicy(Log4j2RollingPolicySystemProperty.STRATEGY, resolver); |
||||||
|
applyRollingPolicy(Log4j2RollingPolicySystemProperty.TIME_INTERVAL, resolver, Integer.class); |
||||||
|
applyRollingPolicy(Log4j2RollingPolicySystemProperty.TIME_MODULATE, resolver, Boolean.class); |
||||||
|
applyRollingPolicy(Log4j2RollingPolicySystemProperty.CRON_SCHEDULE, resolver); |
||||||
|
applyRollingPolicy(Log4j2RollingPolicySystemProperty.FILE_NAME_PATTERN, resolver); |
||||||
|
applyRollingPolicy(Log4j2RollingPolicySystemProperty.MAX_FILE_SIZE, resolver, DataSize.class); |
||||||
|
applyRollingPolicy(Log4j2RollingPolicySystemProperty.MAX_HISTORY, resolver); |
||||||
|
} |
||||||
|
|
||||||
|
private void applyRollingPolicy(Log4j2RollingPolicySystemProperty property, PropertyResolver resolver) { |
||||||
|
applyRollingPolicy(property, resolver, String.class); |
||||||
|
} |
||||||
|
|
||||||
|
private <T> void applyRollingPolicy(Log4j2RollingPolicySystemProperty property, PropertyResolver resolver, |
||||||
|
Class<T> type) { |
||||||
|
T value = getProperty(resolver, property.getApplicationPropertyName(), type); |
||||||
|
if (value == null && property.getDeprecatedApplicationPropertyName() != null) { |
||||||
|
value = getProperty(resolver, property.getDeprecatedApplicationPropertyName(), type); |
||||||
|
} |
||||||
|
if (value != null) { |
||||||
|
String stringValue = String.valueOf((value instanceof DataSize dataSize) ? dataSize.toBytes() : value); |
||||||
|
setSystemProperty(property.getEnvironmentVariableName(), stringValue); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
private <T> @Nullable T getProperty(PropertyResolver resolver, String key, Class<T> type) { |
||||||
|
try { |
||||||
|
return resolver.getProperty(key, type); |
||||||
|
} |
||||||
|
catch (ConversionFailedException | ConverterNotFoundException ex) { |
||||||
|
if (type != DataSize.class) { |
||||||
|
throw ex; |
||||||
|
} |
||||||
|
// Fallback for Log4j2 compatibility - try parsing as string if DataSize
|
||||||
|
// conversion fails
|
||||||
|
String value = resolver.getProperty(key); |
||||||
|
if (value != null) { |
||||||
|
try { |
||||||
|
return (T) DataSize.parse(value); |
||||||
|
} |
||||||
|
catch (Exception parseEx) { |
||||||
|
ex.addSuppressed(parseEx); |
||||||
|
throw ex; |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,95 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-present the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.logging.log4j2; |
||||||
|
|
||||||
|
import org.jspecify.annotations.Nullable; |
||||||
|
|
||||||
|
/** |
||||||
|
* Log4j2 rolling policy system properties that can later be used by log configuration |
||||||
|
* files. |
||||||
|
* |
||||||
|
* @author HoJoo Moon |
||||||
|
* @since 4.0.0 |
||||||
|
* @see Log4j2LoggingSystemProperties |
||||||
|
*/ |
||||||
|
public enum Log4j2RollingPolicySystemProperty { |
||||||
|
|
||||||
|
/** |
||||||
|
* Logging system property for the rolled-over log file name pattern. |
||||||
|
*/ |
||||||
|
FILE_NAME_PATTERN("file-name-pattern", "logging.pattern.rolling-file-name"), |
||||||
|
|
||||||
|
/** |
||||||
|
* Logging system property for the file log max size. |
||||||
|
*/ |
||||||
|
MAX_FILE_SIZE("max-file-size", "logging.file.max-size"), |
||||||
|
|
||||||
|
/** |
||||||
|
* Logging system property for the file log max history. |
||||||
|
*/ |
||||||
|
MAX_HISTORY("max-history", "logging.file.max-history"), |
||||||
|
|
||||||
|
/** |
||||||
|
* Logging system property for the rolling policy strategy. |
||||||
|
*/ |
||||||
|
STRATEGY("strategy", null), |
||||||
|
|
||||||
|
/** |
||||||
|
* Logging system property for the rolling policy time interval. |
||||||
|
*/ |
||||||
|
TIME_INTERVAL("time-based.interval", null), |
||||||
|
|
||||||
|
/** |
||||||
|
* Logging system property for the rolling policy time modulate flag. |
||||||
|
*/ |
||||||
|
TIME_MODULATE("time-based.modulate", null), |
||||||
|
|
||||||
|
/** |
||||||
|
* Logging system property for the cron based schedule. |
||||||
|
*/ |
||||||
|
CRON_SCHEDULE("cron.schedule", null); |
||||||
|
|
||||||
|
private final String environmentVariableName; |
||||||
|
|
||||||
|
private final String applicationPropertyName; |
||||||
|
|
||||||
|
private final @Nullable String deprecatedApplicationPropertyName; |
||||||
|
|
||||||
|
Log4j2RollingPolicySystemProperty(String applicationPropertyName, |
||||||
|
@Nullable String deprecatedApplicationPropertyName) { |
||||||
|
this.environmentVariableName = "LOG4J2_ROLLINGPOLICY_" + name(); |
||||||
|
this.applicationPropertyName = "logging.log4j2.rollingpolicy." + applicationPropertyName; |
||||||
|
this.deprecatedApplicationPropertyName = deprecatedApplicationPropertyName; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the name of environment variable that can be used to access this property. |
||||||
|
* @return the environment variable name |
||||||
|
*/ |
||||||
|
public String getEnvironmentVariableName() { |
||||||
|
return this.environmentVariableName; |
||||||
|
} |
||||||
|
|
||||||
|
String getApplicationPropertyName() { |
||||||
|
return this.applicationPropertyName; |
||||||
|
} |
||||||
|
|
||||||
|
@Nullable String getDeprecatedApplicationPropertyName() { |
||||||
|
return this.deprecatedApplicationPropertyName; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,182 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-present the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.logging.log4j2; |
||||||
|
|
||||||
|
import org.apache.logging.log4j.core.LogEvent; |
||||||
|
import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy; |
||||||
|
import org.apache.logging.log4j.core.appender.rolling.CronTriggeringPolicy; |
||||||
|
import org.apache.logging.log4j.core.appender.rolling.RollingFileManager; |
||||||
|
import org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy; |
||||||
|
import org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy; |
||||||
|
import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy; |
||||||
|
import org.apache.logging.log4j.core.config.Configuration; |
||||||
|
import org.apache.logging.log4j.core.config.Node; |
||||||
|
import org.apache.logging.log4j.core.config.plugins.Plugin; |
||||||
|
import org.apache.logging.log4j.core.config.plugins.PluginAttribute; |
||||||
|
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; |
||||||
|
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; |
||||||
|
import org.apache.logging.log4j.core.util.Builder; |
||||||
|
import org.jspecify.annotations.Nullable; |
||||||
|
|
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
/** |
||||||
|
* Factory for creating a standard Log4j2 {@link TriggeringPolicy} based on configuration |
||||||
|
* attributes. The supported strategies are {@code size}, {@code time}, |
||||||
|
* {@code size-and-time}, and {@code cron}. |
||||||
|
* |
||||||
|
* @author HoJoo Moon |
||||||
|
* @since 4.0.0 |
||||||
|
*/ |
||||||
|
@Plugin(name = "SpringBootTriggeringPolicy", category = Node.CATEGORY, elementType = "TriggeringPolicy", |
||||||
|
deferChildren = true, printObject = true) |
||||||
|
public abstract class SpringBootTriggeringPolicy implements TriggeringPolicy { |
||||||
|
|
||||||
|
private SpringBootTriggeringPolicy() { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void initialize(RollingFileManager manager) { |
||||||
|
throw new UnsupportedOperationException("This class should not be instantiated"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isTriggeringEvent(LogEvent logEvent) { |
||||||
|
throw new UnsupportedOperationException("This class should not be instantiated"); |
||||||
|
} |
||||||
|
|
||||||
|
@PluginBuilderFactory |
||||||
|
public static SpringBootTriggeringPolicyBuilder newBuilder() { |
||||||
|
return new SpringBootTriggeringPolicyBuilder(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Builder for creating a {@link TriggeringPolicy}. |
||||||
|
*/ |
||||||
|
public static class SpringBootTriggeringPolicyBuilder implements Builder<TriggeringPolicy> { |
||||||
|
|
||||||
|
private static final String DEFAULT_STRATEGY = "size"; |
||||||
|
|
||||||
|
private static final String DEFAULT_MAX_FILE_SIZE = "10MB"; |
||||||
|
|
||||||
|
private static final int DEFAULT_TIME_INTERVAL = 1; |
||||||
|
|
||||||
|
private static final String DEFAULT_CRON_EXPRESSION = "0 0 0 * * ?"; |
||||||
|
|
||||||
|
@PluginAttribute("strategy") |
||||||
|
private @Nullable String strategy; |
||||||
|
|
||||||
|
@PluginAttribute("maxFileSize") |
||||||
|
private @Nullable String maxFileSize; |
||||||
|
|
||||||
|
@PluginAttribute("timeInterval") |
||||||
|
private @Nullable Integer timeInterval; |
||||||
|
|
||||||
|
@PluginAttribute("timeModulate") |
||||||
|
private @Nullable Boolean timeModulate; |
||||||
|
|
||||||
|
@PluginAttribute("cronExpression") |
||||||
|
private @Nullable String cronExpression; |
||||||
|
|
||||||
|
@PluginConfiguration |
||||||
|
private @Nullable Configuration configuration; |
||||||
|
|
||||||
|
@Override |
||||||
|
public TriggeringPolicy build() { |
||||||
|
// Read strategy from system properties first, then from attributes
|
||||||
|
String resolvedStrategy = System.getProperty("LOG4J2_ROLLINGPOLICY_STRATEGY"); |
||||||
|
if (resolvedStrategy == null) { |
||||||
|
resolvedStrategy = (this.strategy != null) ? this.strategy : DEFAULT_STRATEGY; |
||||||
|
} |
||||||
|
return switch (resolvedStrategy) { |
||||||
|
case "time" -> createTimePolicy(); |
||||||
|
case "size-and-time" -> CompositeTriggeringPolicy.createPolicy(createSizePolicy(), createTimePolicy()); |
||||||
|
case "cron" -> createCronPolicy(); |
||||||
|
case "size" -> createSizePolicy(); |
||||||
|
default -> throw new IllegalArgumentException( |
||||||
|
"Unsupported rolling policy strategy '%s'".formatted(resolvedStrategy)); |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
private TriggeringPolicy createSizePolicy() { |
||||||
|
// Read from system properties first, then from attributes
|
||||||
|
String size = System.getProperty("LOG4J2_ROLLINGPOLICY_MAX_FILE_SIZE"); |
||||||
|
if (size == null) { |
||||||
|
size = (this.maxFileSize != null) ? this.maxFileSize : DEFAULT_MAX_FILE_SIZE; |
||||||
|
} |
||||||
|
return SizeBasedTriggeringPolicy.createPolicy(size); |
||||||
|
} |
||||||
|
|
||||||
|
private TriggeringPolicy createTimePolicy() { |
||||||
|
// Read from system properties first, then from attributes
|
||||||
|
String intervalStr = System.getProperty("LOG4J2_ROLLINGPOLICY_TIME_INTERVAL"); |
||||||
|
int interval = (intervalStr != null) ? Integer.parseInt(intervalStr) |
||||||
|
: (this.timeInterval != null) ? this.timeInterval : DEFAULT_TIME_INTERVAL; |
||||||
|
|
||||||
|
String modulateStr = System.getProperty("LOG4J2_ROLLINGPOLICY_TIME_MODULATE"); |
||||||
|
boolean modulate = (modulateStr != null) ? Boolean.parseBoolean(modulateStr) |
||||||
|
: (this.timeModulate != null) ? this.timeModulate : false; |
||||||
|
|
||||||
|
return TimeBasedTriggeringPolicy.newBuilder().withInterval(interval).withModulate(modulate).build(); |
||||||
|
} |
||||||
|
|
||||||
|
private TriggeringPolicy createCronPolicy() { |
||||||
|
Assert.notNull(this.configuration, "configuration must not be null"); |
||||||
|
Configuration configuration = this.configuration; |
||||||
|
|
||||||
|
// Read from system properties first, then from attributes
|
||||||
|
String schedule = System.getProperty("LOG4J2_ROLLINGPOLICY_CRON_SCHEDULE"); |
||||||
|
if (schedule == null) { |
||||||
|
schedule = (this.cronExpression != null) ? this.cronExpression : DEFAULT_CRON_EXPRESSION; |
||||||
|
} |
||||||
|
|
||||||
|
return CronTriggeringPolicy.createPolicy(configuration, null, schedule); |
||||||
|
} |
||||||
|
|
||||||
|
SpringBootTriggeringPolicyBuilder setStrategy(@Nullable String strategy) { |
||||||
|
this.strategy = strategy; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
SpringBootTriggeringPolicyBuilder setMaxFileSize(@Nullable String maxFileSize) { |
||||||
|
this.maxFileSize = maxFileSize; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
SpringBootTriggeringPolicyBuilder setTimeInterval(@Nullable Integer timeInterval) { |
||||||
|
this.timeInterval = timeInterval; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
SpringBootTriggeringPolicyBuilder setTimeModulate(@Nullable Boolean timeModulate) { |
||||||
|
this.timeModulate = timeModulate; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
SpringBootTriggeringPolicyBuilder setCronExpression(@Nullable String cronExpression) { |
||||||
|
this.cronExpression = cronExpression; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
SpringBootTriggeringPolicyBuilder setConfiguration(Configuration configuration) { |
||||||
|
this.configuration = configuration; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,122 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-present the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.logging.log4j2; |
||||||
|
|
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.AfterEach; |
||||||
|
import org.junit.jupiter.api.BeforeEach; |
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
import org.springframework.boot.convert.ApplicationConversionService; |
||||||
|
import org.springframework.boot.logging.LogFile; |
||||||
|
import org.springframework.boot.logging.LoggingSystemProperty; |
||||||
|
import org.springframework.core.convert.support.ConfigurableConversionService; |
||||||
|
import org.springframework.mock.env.MockEnvironment; |
||||||
|
import org.springframework.util.unit.DataSize; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link Log4j2LoggingSystemProperties}. |
||||||
|
* |
||||||
|
* @author hojooo |
||||||
|
*/ |
||||||
|
class Log4j2LoggingSystemPropertiesTests { |
||||||
|
|
||||||
|
private Set<Object> systemPropertyNames; |
||||||
|
|
||||||
|
private MockEnvironment environment; |
||||||
|
|
||||||
|
@BeforeEach |
||||||
|
void captureSystemPropertyNames() { |
||||||
|
for (LoggingSystemProperty property : LoggingSystemProperty.values()) { |
||||||
|
System.getProperties().remove(property.getEnvironmentVariableName()); |
||||||
|
} |
||||||
|
this.systemPropertyNames = new HashSet<>(System.getProperties().keySet()); |
||||||
|
this.environment = new MockEnvironment(); |
||||||
|
this.environment |
||||||
|
.setConversionService((ConfigurableConversionService) ApplicationConversionService.getSharedInstance()); |
||||||
|
} |
||||||
|
|
||||||
|
@AfterEach |
||||||
|
void restoreSystemProperties() { |
||||||
|
System.getProperties().keySet().retainAll(this.systemPropertyNames); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void appliesLog4j2RollingPolicyProperties() { |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.max-file-size", "50MB"); |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.max-history", "30"); |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.file-name-pattern", "test.%d{yyyy-MM-dd}.%i.log"); |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.strategy", "time"); |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.time-based.interval", "2"); |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.time-based.modulate", "true"); |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.cron.schedule", "0 0 0 * * ?"); |
||||||
|
|
||||||
|
new Log4j2LoggingSystemProperties(this.environment).apply(null); |
||||||
|
|
||||||
|
assertThat(System.getProperties()) |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_MAX_FILE_SIZE", String.valueOf(DataSize.ofMegabytes(50).toBytes())) |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_MAX_HISTORY", "30") |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_FILE_NAME_PATTERN", "test.%d{yyyy-MM-dd}.%i.log") |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_STRATEGY", "time") |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_TIME_INTERVAL", "2") |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_TIME_MODULATE", "true") |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_CRON_SCHEDULE", "0 0 0 * * ?"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void appliesLog4j2RollingPolicyPropertiesWithDefaults() { |
||||||
|
new Log4j2LoggingSystemProperties(this.environment).apply(null); |
||||||
|
assertThat(System.getProperties().keySet()) |
||||||
|
.noneMatch((key) -> ((String) key).startsWith("LOG4J2_ROLLINGPOLICY")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void appliesDeprecatedProperties() { |
||||||
|
this.environment.setProperty("logging.file.max-size", "20MB"); |
||||||
|
this.environment.setProperty("logging.file.max-history", "15"); |
||||||
|
new Log4j2LoggingSystemProperties(this.environment).apply(null); |
||||||
|
assertThat(System.getProperties()) |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_MAX_FILE_SIZE", String.valueOf(DataSize.ofMegabytes(20).toBytes())) |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_MAX_HISTORY", "15"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void newPropertiesOverrideDeprecatedProperties() { |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.max-file-size", "100MB"); |
||||||
|
this.environment.setProperty("logging.file.max-size", "20MB"); |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.max-history", "50"); |
||||||
|
this.environment.setProperty("logging.file.max-history", "15"); |
||||||
|
new Log4j2LoggingSystemProperties(this.environment).apply(null); |
||||||
|
assertThat(System.getProperties()) |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_MAX_FILE_SIZE", String.valueOf(DataSize.ofMegabytes(100).toBytes())) |
||||||
|
.containsEntry("LOG4J2_ROLLINGPOLICY_MAX_HISTORY", "50"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void appliesWithLogFile() { |
||||||
|
this.environment.setProperty("logging.log4j2.rollingpolicy.max-file-size", "25MB"); |
||||||
|
LogFile logFile = LogFile.get(this.environment); |
||||||
|
new Log4j2LoggingSystemProperties(this.environment).apply(logFile); |
||||||
|
assertThat(System.getProperties()).containsEntry("LOG4J2_ROLLINGPOLICY_MAX_FILE_SIZE", |
||||||
|
String.valueOf(DataSize.ofMegabytes(25).toBytes())); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue