So would it be a decent idea to add a similar extended LoggerContextFactory to log4j-jul so it auto sets up in other environments? I find that specifying the system property at the right time in code is very difficult to get right, and the reason this worked well enough with spring boot was because of the main class used in your main method calling LogFactory.getLogger() on initialization.
---------- Forwarded message ---------- From: <mattsic...@apache.org> Date: 14 January 2017 at 17:40 Subject: logging-log4j-boot git commit: Add log4j-boot-spring module To: comm...@logging.apache.org Repository: logging-log4j-boot Updated Branches: refs/heads/master 35f38d944 -> 3619ca0c2 Add log4j-boot-spring module This is a spring-boot-starter module for bootstrapping Log4j accordingly with default config files inspired by spring-boot-starter-log4j2. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ commit/3619ca0c Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ tree/3619ca0c Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ diff/3619ca0c Branch: refs/heads/master Commit: 3619ca0c2abd62f3ef18369987fa376f562a8dac Parents: 35f38d9 Author: Matt Sicker <boa...@gmail.com> Authored: Sat Jan 14 17:39:12 2017 -0600 Committer: Matt Sicker <boa...@gmail.com> Committed: Sat Jan 14 17:39:12 2017 -0600 ---------------------------------------------------------------------- pom.xml | 4 + spring/pom.xml | 66 +++++++ .../AutoConfiguringLoggerContextFactory.java | 34 ++++ .../log4j/boot/spring/Log4jLoggingSystem.java | 191 +++++++++++++++++++ .../META-INF/log4j/default/log4j2-file.xml | 57 ++++++ .../resources/META-INF/log4j/default/log4j2.xml | 50 +++++ .../main/resources/log4j2.component.properties | 20 ++ .../boot/spring/LoggingInitializerTest.java | 62 ++++++ 8 files changed, 484 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ blob/3619ca0c/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 415da22..ea5cd77 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,8 @@ <url>https://logging.apache.org/log4j/boot/</url> <properties> + <maven.compiler.source>1.7</maven.compiler.source> + <maven.compiler.target>1.7</maven.compiler.target> <log4jVersion>2.7.1-SNAPSHOT</log4jVersion> <slf4jVersion>1.7.22</slf4jVersion> <activemqVersion>5.14.1</activemqVersion> @@ -62,6 +64,7 @@ <logbackVersion>1.1.8</logbackVersion> <kafkaVersion>0.10.1.1</kafkaVersion> <mongodbVersion>3.4.1</mongodbVersion> + <springbootVersion>1.4.3.RELEASE</springbootVersion> </properties> <modules> @@ -90,6 +93,7 @@ <module>layout/xml</module> <module>layout/yaml</module> <module>script/groovy</module> + <module>spring</module> </modules> <scm> http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ blob/3619ca0c/spring/pom.xml ---------------------------------------------------------------------- diff --git a/spring/pom.xml b/spring/pom.xml new file mode 100644 index 0000000..5985328 --- /dev/null +++ b/spring/pom.xml @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you 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. + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>log4j-boot-parent</artifactId> + <groupId>org.apache.logging.log4j.boot</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>log4j-boot-spring</artifactId> + <name>Log4j Spring Boot Starter</name> + <description> + Log4j Boot module for integration with Spring Boot. This module can be used as a complete replacement for + spring-boot-starter-logging or spring-boot-starter-log4j2. + </description> + + <dependencies> + <dependency> + <groupId>org.apache.logging.log4j.boot</groupId> + <artifactId>log4j-boot-core</artifactId> + <version>1.0-SNAPSHOT</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j.boot</groupId> + <artifactId>log4j-boot-compat</artifactId> + <version>1.0-SNAPSHOT</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot</artifactId> + <version>${springbootVersion}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <version>${springbootVersion}</version> + <scope>test</scope> + </dependency> + </dependencies> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ blob/3619ca0c/spring/src/main/java/org/apache/logging/log4j/boot/spring/ AutoConfiguringLoggerContextFactory.java ---------------------------------------------------------------------- diff --git a/spring/src/main/java/org/apache/logging/log4j/boot/spring/ AutoConfiguringLoggerContextFactory.java b/spring/src/main/java/org/ apache/logging/log4j/boot/spring/AutoConfiguringLoggerContextFactory.java new file mode 100644 index 0000000..706f1db --- /dev/null +++ b/spring/src/main/java/org/apache/logging/log4j/boot/spring/ AutoConfiguringLoggerContextFactory.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.logging.log4j.boot.spring; + +import org.apache.logging.log4j.core.impl.Log4jContextFactory; +import org.springframework.boot.logging.LoggingSystem; + +/** + * LoggerContextFactory extension to automatically register logging systems. + */ +public class AutoConfiguringLoggerContextFactory extends Log4jContextFactory { + + static { + System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); + System.setProperty(LoggingSystem.SYSTEM_PROPERTY, Log4jLoggingSystem.class.getName()); + } + +} http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ blob/3619ca0c/spring/src/main/java/org/apache/logging/log4j/boot/spring/ Log4jLoggingSystem.java ---------------------------------------------------------------------- diff --git a/spring/src/main/java/org/apache/logging/log4j/boot/spring/Log4jLoggingSystem.java b/spring/src/main/java/org/apache/logging/log4j/boot/ spring/Log4jLoggingSystem.java new file mode 100644 index 0000000..e0bad83 --- /dev/null +++ b/spring/src/main/java/org/apache/logging/log4j/boot/ spring/Log4jLoggingSystem.java @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.logging.log4j.boot.spring; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.ConfigurationFactory; +import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.logging.log4j.core.config.plugins.util.PluginManager; +import org.apache.logging.log4j.core.config.plugins.util.PluginType; +import org.apache.logging.log4j.core.util.NetUtils; +import org.apache.logging.log4j.core.util.ReflectionUtil; +import org.apache.logging.log4j.core.util.Throwables; +import org.apache.logging.log4j.util.Strings; +import org.springframework.boot.logging.AbstractLoggingSystem; +import org.springframework.boot.logging.LogFile; +import org.springframework.boot.logging.LogLevel; +import org.springframework.boot.logging.LoggingInitializationContext; + +import java.lang.reflect.Method; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Spring Boot LoggingSystem for integration with Log4j 2. + */ +public class Log4jLoggingSystem extends AbstractLoggingSystem { + + static { + Method factoryIsActive; + Method factorySupportedTypes; + try { + factoryIsActive = ConfigurationFactory.class. getDeclaredMethod("isActive"); + ReflectionUtil.makeAccessible(factoryIsActive); + factorySupportedTypes = ConfigurationFactory.class. getDeclaredMethod("getSupportedTypes"); + ReflectionUtil.makeAccessible(factorySupportedTypes); + } catch (final NoSuchMethodException e) { + Throwables.rethrow(e); + // unreachable; make the compiler happy + factoryIsActive = null; + factorySupportedTypes = null; + } + FACTORY_IS_ACTIVE = factoryIsActive; + FACTORY_SUPPORTED_TYPES = factorySupportedTypes; + } + + private static final Method FACTORY_IS_ACTIVE; + private static final Method FACTORY_SUPPORTED_TYPES; + + private final String[] standardConfigLocations; + private LoggerContext loggerContext; + + public Log4jLoggingSystem(final ClassLoader classLoader) { + super(classLoader); + this.standardConfigLocations = determineStandardConfigLocations(); + } + + private static String[] determineStandardConfigLocations() { + final List<String> locations = new ArrayList<>(); + for (final ConfigurationFactory factory : findFactories()) { + for (final String extension : getSupportedTypes(factory)) { + if ("*".equals(extension)) { + continue; + } + locations.add("log4j2-test" + extension); + locations.add("log4j2" + extension); + } + } + return locations.toArray(new String[0]); + } + + private static Collection<ConfigurationFactory> findFactories() { + final PluginManager manager = new PluginManager( ConfigurationFactory.CATEGORY); + manager.collectPlugins(); + final Collection<ConfigurationFactory> factories = new ArrayList<>(); + for (final PluginType<?> type : manager.getPlugins().values()) { + final ConfigurationFactory factory = tryCreateFactory(type); + if (factory != null) { + factories.add(factory); + } + } + return factories; + } + + private static ConfigurationFactory tryCreateFactory(final PluginType<?> pluginType) { + try { + return pluginType.getPluginClass().asSubclass( ConfigurationFactory.class).newInstance(); + } catch (final Exception ignored) { + return null; + } + } + + private static String[] getSupportedTypes(final ConfigurationFactory factory) { + try { + if ((boolean) FACTORY_IS_ACTIVE.invoke(factory)) { + return (String[]) FACTORY_SUPPORTED_TYPES.invoke(factory); + } + } catch (final Exception ignored) { + } + return new String[0]; + } + + @Override + protected String[] getStandardConfigLocations() { + return standardConfigLocations; + } + + @Override + protected void loadDefaults(final LoggingInitializationContext context, final LogFile file) { + final String configFileName = "classpath:META-INF/log4j/ default/log4j2" + + ((file == null) ? Strings.EMPTY : "-file") + + ".xml"; + loadConfiguration(context, configFileName, file); + } + + @Override + protected void loadConfiguration(final LoggingInitializationContext context, final String location, + final LogFile file) { + final URI configLocation = NetUtils.toURI(location); + loggerContext = (LoggerContext) LogManager.getContext( + getClassLoader(), false, this, configLocation); + } + + @Override + protected void reinitialize(final LoggingInitializationContext context) { + if (loggerContext != null) { + loggerContext.reconfigure(); + } + } + + @Override + public void cleanUp() { + if (loggerContext != null) { + loggerContext.setExternalContext(null); + loggerContext.terminate(); + } + } + + @Override + public void setLogLevel(final String loggerName, final LogLevel logLevel) { + if (loggerContext != null) { + final Logger logger = loggerContext.getLogger(loggerName); + final LoggerConfig config = logger.get(); + final Level level = convert(logLevel); + if (config.getLevel() != level) { + config.setLevel(level); + } + } + } + + private static Level convert(final LogLevel logLevel) { + switch (logLevel) { + case FATAL: + return Level.FATAL; + case ERROR: + return Level.ERROR; + case WARN: + return Level.WARN; + case INFO: + return Level.INFO; + case DEBUG: + return Level.DEBUG; + case TRACE: + return Level.TRACE; + case OFF: + return Level.OFF; + default: + return Level.toLevel(logLevel.name()); + } + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ blob/3619ca0c/spring/src/main/resources/META-INF/log4j/ default/log4j2-file.xml ---------------------------------------------------------------------- diff --git a/spring/src/main/resources/META-INF/log4j/default/log4j2-file.xml b/spring/src/main/resources/META-INF/log4j/default/log4j2-file.xml new file mode 100644 index 0000000..9880ceb --- /dev/null +++ b/spring/src/main/resources/META-INF/log4j/default/log4j2-file.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you 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. + --> + +<Configuration status="WARN"> + <Properties> + <Property name="PID">????</Property> + <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xEx</ Property> + <Property name="LOG_LEVEL_PATTERN">%5p</Property> + <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property> + </Properties> + <Appenders> + <Console name="Console" target="SYSTEM_OUT" follow="true"> + <PatternLayout pattern="${LOG_PATTERN}" /> + </Console> + <RollingFile name="File" fileName="${sys:LOG_FILE}" filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz"> + <PatternLayout pattern="${LOG_PATTERN}"/> + <Policies> + <SizeBasedTriggeringPolicy size="10 MB" /> + </Policies> + </RollingFile> + </Appenders> + <Loggers> + <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" /> + <Logger name="org.apache.catalina.util.LifecycleBase" level="error" /> + <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" /> + <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/> + <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" /> + <Logger name="org.crsh.plugin" level="warn" /> + <logger name="org.crsh.ssh" level="warn"/> + <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" /> + <Logger name="org.hibernate.validator.internal.util.Version" level="warn" /> + <logger name="org.springframework. boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/> + <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/> + <logger name="org.thymeleaf" level="warn"/> + <Root level="info"> + <AppenderRef ref="Console" /> + <AppenderRef ref="File" /> + </Root> + </Loggers> +</Configuration> http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ blob/3619ca0c/spring/src/main/resources/META-INF/log4j/default/log4j2.xml ---------------------------------------------------------------------- diff --git a/spring/src/main/resources/META-INF/log4j/default/log4j2.xml b/spring/src/main/resources/META-INF/log4j/default/log4j2.xml new file mode 100644 index 0000000..2ede5aa --- /dev/null +++ b/spring/src/main/resources/META-INF/log4j/default/log4j2.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you 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. + --> + +<Configuration status="WARN"> + <Properties> + <Property name="PID">????</Property> + <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xEx</ Property> + <Property name="LOG_LEVEL_PATTERN">%5p</Property> + <Property name="LOG_PATTERN">%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{dim} %highlight{${LOG_LEVEL_PATTERN}} %style{${sys:PID}}{magenta} %style{---}{dim} %style{[%15.15t]}{dim} %style{%-40.40c{1.}}{cyan} %style{:}{faint} %m%n${sys:LOG_EXCEPTION_ CONVERSION_WORD}</Property> + </Properties> + <Appenders> + <Console name="Console" target="SYSTEM_OUT" follow="true"> + <PatternLayout pattern="${LOG_PATTERN}" /> + </Console> + </Appenders> + <Loggers> + <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" /> + <Logger name="org.apache.catalina.util.LifecycleBase" level="error" /> + <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" /> + <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/> + <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" /> + <Logger name="org.crsh.plugin" level="warn" /> + <logger name="org.crsh.ssh" level="warn"/> + <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" /> + <Logger name="org.hibernate.validator.internal.util.Version" level="warn" /> + <logger name="org.springframework. boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/> + <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/> + <logger name="org.thymeleaf" level="warn"/> + <Root level="info"> + <AppenderRef ref="Console" /> + </Root> + </Loggers> +</Configuration> http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ blob/3619ca0c/spring/src/main/resources/log4j2.component.properties ---------------------------------------------------------------------- diff --git a/spring/src/main/resources/log4j2.component.properties b/spring/src/main/resources/log4j2.component.properties new file mode 100644 index 0000000..34d00f4 --- /dev/null +++ b/spring/src/main/resources/log4j2.component.properties @@ -0,0 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# + +log4j2.loggerContextFactory = org.apache.logging.log4j.boot.spring. AutoConfiguringLoggerContextFactory \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/ blob/3619ca0c/spring/src/test/java/org/apache/logging/log4j/boot/spring/ LoggingInitializerTest.java ---------------------------------------------------------------------- diff --git a/spring/src/test/java/org/apache/logging/log4j/boot/ spring/LoggingInitializerTest.java b/spring/src/test/java/org/ apache/logging/log4j/boot/spring/LoggingInitializerTest.java new file mode 100644 index 0000000..b7002f3 --- /dev/null +++ b/spring/src/test/java/org/apache/logging/log4j/boot/ spring/LoggingInitializerTest.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.logging.log4j.boot.spring; + +import org.apache.commons.logging.LogFactory; +import org.apache.logging.log4j.jcl.LogFactoryImpl; +import org.apache.logging.slf4j.Log4jLoggerFactory; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.ILoggerFactory; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.logging.LogManager; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration test to verify Spring Boot uses the proper logging facades. + */ +@RunWith(SpringRunner.class) +@SpringBootApplication +@SpringBootTest +public class LoggingInitializerTest { + + @Test + public void testJavaUtilLogManagerSet() throws Throwable { + LogManager logManager = LogManager.getLogManager(); + assertThat(logManager).isInstanceOf(org.apache. logging.log4j.jul.LogManager.class); + } + + @Test + public void testCommonsLogFactorySet() throws Throwable { + LogFactory logFactory = LogFactory.getFactory(); + assertThat(logFactory).isInstanceOf(LogFactoryImpl.class); + } + + @Test + public void testSlf4jFactorySet() throws Exception { + ILoggerFactory factory = LoggerFactory.getILoggerFactory(); + assertThat(factory).isInstanceOf(Log4jLoggerFactory.class); + } +} \ No newline at end of file -- Matt Sicker <boa...@gmail.com>