Back off auto-config of Log4J2Metrics when context is backed by SLF4J
Closes gh-14883
This commit is contained in:
@@ -480,11 +480,6 @@
|
||||
<artifactId>log4j-slf4j-impl</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-api</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>aspectjrt</artifactId>
|
||||
|
||||
@@ -16,16 +16,25 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.metrics;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.binder.logging.Log4j2Metrics;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.core.LoggerContext;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.Log4J2MetricsAutoConfiguration.Log4JCoreLoggerContextCondition;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ConditionContext;
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
|
||||
/**
|
||||
* Auto-configuration for Log4J2 metrics.
|
||||
@@ -35,14 +44,33 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Configuration
|
||||
@AutoConfigureAfter(MetricsAutoConfiguration.class)
|
||||
@ConditionalOnClass({ Log4j2Metrics.class, LoggerContext.class })
|
||||
@ConditionalOnClass({ Log4j2Metrics.class, LoggerContext.class, LogManager.class })
|
||||
@ConditionalOnBean(MeterRegistry.class)
|
||||
@Conditional(Log4JCoreLoggerContextCondition.class)
|
||||
public class Log4J2MetricsAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public Log4j2Metrics log4j2Metrics() {
|
||||
return new Log4j2Metrics();
|
||||
return new Log4j2Metrics(Collections.emptyList(),
|
||||
(LoggerContext) LogManager.getContext(false));
|
||||
}
|
||||
|
||||
static class Log4JCoreLoggerContextCondition extends SpringBootCondition {
|
||||
|
||||
@Override
|
||||
public ConditionOutcome getMatchOutcome(ConditionContext context,
|
||||
AnnotatedTypeMetadata metadata) {
|
||||
org.apache.logging.log4j.spi.LoggerContext loggerContext = LogManager
|
||||
.getContext(false);
|
||||
if (loggerContext instanceof LoggerContext) {
|
||||
return ConditionOutcome.match(
|
||||
"LoggerContext was an instance of org.apache.logging.log4j.spi.LoggerContext");
|
||||
}
|
||||
return ConditionOutcome.noMatch(
|
||||
"Logger context was not an instance of org.apache.logging.log4j.spi.LoggerContext");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2012-2018 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
|
||||
*
|
||||
* http://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.actuate.autoconfigure.metrics;
|
||||
|
||||
import io.micrometer.core.instrument.binder.logging.Log4j2Metrics;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.boot.testsupport.runner.classpath.ClassPathExclusions;
|
||||
import org.springframework.boot.testsupport.runner.classpath.ClassPathOverrides;
|
||||
import org.springframework.boot.testsupport.runner.classpath.ModifiedClassPathRunner;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link Log4J2MetricsAutoConfiguration}.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@RunWith(ModifiedClassPathRunner.class)
|
||||
@ClassPathOverrides({ "org.apache.logging.log4j:log4j-to-slf4j:2.11.1",
|
||||
"org.apache.logging.log4j:log4j-core:2.11.1" })
|
||||
@ClassPathExclusions("log4j-slf4j-impl-*.jar")
|
||||
public class Log4J2MetricsWithSlf4jLoggerContextAutoConfigurationTests {
|
||||
|
||||
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.with(MetricsRun.simple()).withConfiguration(
|
||||
AutoConfigurations.of(Log4J2MetricsAutoConfiguration.class));
|
||||
|
||||
@Test
|
||||
public void backsOffWhenLoggerContextIsBackedBySlf4j() {
|
||||
this.contextRunner.run(
|
||||
(context) -> assertThat(context).doesNotHaveBean(Log4j2Metrics.class));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user