You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by Matt Sicker <bo...@gmail.com> on 2017/01/14 23:43:47 UTC

Fwd: logging-log4j-boot git commit: Add log4j-boot-spring module

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: <ma...@apache.org>
Date: 14 January 2017 at 17:40
Subject: logging-log4j-boot git commit: Add log4j-boot-spring module
To: commits@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 <bo...@gmail.com>
Authored: Sat Jan 14 17:39:12 2017 -0600
Committer: Matt Sicker <bo...@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 <bo...@gmail.com>

Re: logging-log4j-boot git commit: Add log4j-boot-spring module

Posted by Matt Sicker <bo...@gmail.com>.
In Spring Boot, Tomcat is on the same classpath as everything else I think
as it's embedded.

On 14 January 2017 at 20:30, Apache <ra...@dslextreme.com> wrote:

> I have run into problems with log4j-jul. It does not work well in Tomcat
> as the jar really has to be in Tomcat’s classpath, which means all the
> other log4j jars also need to be. It also has to initialize before Tomcat
> starts using java.util.logging, which is a bit of a pain. I don’t think
> there is any decent way to improve it to fix the problems you note. I just
> try to avoid everything that uses jul for logging.
>
> Ralph
>
> On Jan 14, 2017, at 4:43 PM, Matt Sicker <bo...@gmail.com> wrote:
>
> 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: <ma...@apache.org>
> Date: 14 January 2017 at 17:40
> Subject: logging-log4j-boot git commit: Add log4j-boot-spring module
> To: commits@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/co
> mmit/3619ca0c
> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/tr
> ee/3619ca0c
> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/di
> ff/3619ca0c
>
> Branch: refs/heads/master
> Commit: 3619ca0c2abd62f3ef18369987fa376f562a8dac
> Parents: 35f38d9
> Author: Matt Sicker <bo...@gmail.com>
> Authored: Sat Jan 14 17:39:12 2017 -0600
> Committer: Matt Sicker <bo...@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/bl
> ob/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/bl
> ob/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/bl
> ob/3619ca0c/spring/src/main/java/org/apache/logging/log4j/bo
> ot/spring/AutoConfiguringLoggerContextFactory.java
> ----------------------------------------------------------------------
> diff --git a/spring/src/main/java/org/apache/logging/log4j/boot/spring/
> AutoConfiguringLoggerContextFactory.java b/spring/src/main/java/org/apa
> che/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/bl
> ob/3619ca0c/spring/src/main/java/org/apache/logging/log4j/bo
> ot/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.get
> DeclaredMethod("isActive");
> +            ReflectionUtil.makeAccessible(factoryIsActive);
> +            factorySupportedTypes = ConfigurationFactory.class.get
> DeclaredMethod("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 = determineStandardConfigLocatio
> ns();
> +    }
> +
> +    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(ConfigurationFac
> tory.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().as
> Subclass(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/defa
> ult/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/bl
> ob/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/bl
> ob/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_CONVER
> SION_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/bl
> ob/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/bl
> ob/3619ca0c/spring/src/test/java/org/apache/logging/log4j/bo
> ot/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 <bo...@gmail.com>
>
>
>


-- 
Matt Sicker <bo...@gmail.com>

Re: logging-log4j-boot git commit: Add log4j-boot-spring module

Posted by Apache <ra...@dslextreme.com>.
I have run into problems with log4j-jul. It does not work well in Tomcat as the jar really has to be in Tomcat’s classpath, which means all the other log4j jars also need to be. It also has to initialize before Tomcat starts using java.util.logging, which is a bit of a pain. I don’t think there is any decent way to improve it to fix the problems you note. I just try to avoid everything that uses jul for logging.

Ralph

> On Jan 14, 2017, at 4:43 PM, Matt Sicker <bo...@gmail.com> wrote:
> 
> 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: <mattsicker@apache.org <ma...@apache.org>>
> Date: 14 January 2017 at 17:40
> Subject: logging-log4j-boot git commit: Add log4j-boot-spring module
> To: commits@logging.apache.org <ma...@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 <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 <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 <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 <http://git-wip-us.apache.org/repos/asf/logging-log4j-boot/diff/3619ca0c>
> 
> Branch: refs/heads/master
> Commit: 3619ca0c2abd62f3ef18369987fa376f562a8dac
> Parents: 35f38d9
> Author: Matt Sicker <boards@gmail.com <ma...@gmail.com>>
> Authored: Sat Jan 14 17:39:12 2017 -0600
> Committer: Matt Sicker <boards@gmail.com <ma...@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 <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/ <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 <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 <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 <http://maven.apache.org/POM/4.0.0>"
> +         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance <http://www.w3.org/2001/XMLSchema-instance>"
> +         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 <http://maven.apache.org/POM/4.0.0> http://maven.apache.org/xsd/maven-4.0.0.xsd <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <boards@gmail.com <ma...@gmail.com>>