diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml
index 6fb8c93579..130f4cc33b 100644
--- a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml
+++ b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml
@@ -480,11 +480,6 @@
log4j-slf4j-impl
test
-
- org.apache.logging.log4j
- log4j-api
- test
-
org.aspectj
aspectjrt
diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsAutoConfiguration.java
index 5ffdbc8345..bc646e623c 100644
--- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsAutoConfiguration.java
+++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsAutoConfiguration.java
@@ -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");
+ }
+
}
}
diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsWithSlf4jLoggerContextAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsWithSlf4jLoggerContextAutoConfigurationTests.java
new file mode 100644
index 0000000000..d1fb3209a5
--- /dev/null
+++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/Log4J2MetricsWithSlf4jLoggerContextAutoConfigurationTests.java
@@ -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));
+ }
+
+}