Back off auto-config of Log4J2Metrics when context is backed by SLF4J

Closes gh-14883
pull/14894/head
Andy Wilkinson 6 years ago
parent ebcc5d8b1f
commit 3177584588

@ -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));
}
}
Loading…
Cancel
Save