如何在 Spring Boot 中使用 Log4J2 复合配置

Posted

技术标签:

【中文标题】如何在 Spring Boot 中使用 Log4J2 复合配置【英文标题】:How to use Log4J2 composite configuration with Spring Boot 【发布时间】:2018-10-13 04:19:32 【问题描述】:

我正在使用 Spring Boot 2.0.1 启动器和 log4j2,使用以下 POM。 WAR 文件托管在 Tomcat 8 中(而不是使用嵌入式 tomcat)。应用程序日志写入控制台而不是写入日志文件。显然 Spring Boot 的 XML 配置覆盖了应用程序中配置的配置。

POM:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
    </dependency>

Log4j2 使用复合配置,其中配置拆分为 2 个 xml 文件:log4j2-base.xmllog4j2-env.xml

Resources 目录包含log4j2.component.properties,内容如下:

log4j.configurationFile=log4j2-base.xml,log4j2-env.xml

Resources 目录还包含log4j2-base.xml。文件 log4j2-env.xml 是环境特定 JAR 文件的一部分,已放入类路径中。

日志:

DEBUG StatusLogger Configuration XmlConfiguration[location=jar:file:/usr/mware/jwsAppDetails/app1/webapps/myProject/WEB-INF/lib/spring-boot-2.0.1.RELEASE.jar!/org/springframework/boot/logging/log4j2/log4j2.xml] initialized
DEBUG StatusLogger Starting configuration XmlConfiguration[location=jar:file:/usr/mware/jwsAppDetails/app1/webapps/myProject/WEB-INF/lib/spring-boot-2.0.1.RELEASE.jar!/org/springframework/boot/logging/log4j2/log4j2.xml]
DEBUG StatusLogger Started configuration XmlConfiguration[location=jar:file:/usr/mware/jwsAppDetails/app1/webapps/myProject/WEB-INF/lib/spring-boot-2.0.1.RELEASE.jar!/org/springframework/boot/logging/log4j2/log4j2.xml] OK.
TRACE StatusLogger Stopping org.apache.logging.log4j.core.config.composite.CompositeConfiguration@40575bb9 [configurations=[XmlConfiguration[location=/usr/mware/jwsAppDetails/app1/webapps/myProject/WEB-INF/classes/log4j2-base.xml], XmlConfiguration[location=jar:file:/usr/mware/jwsAppDetails/app1/lib/myProject.jar!/log4j2-env.xml]], mergeStrategy=org.apache.logging.log4j.core.config.composite.DefaultMergeStrategy@583fc0cb, rootNode=null, listeners=[], pluginPackages=[], pluginManager=org.apache.logging.log4j.core.config.plugins.util.PluginManager@278307b, isShutdownHookEnabled=true, shutdownTimeoutMillis=0, scriptManager=org.apache.logging.log4j.core.script.ScriptManager@185463aa]...
TRACE StatusLogger CompositeConfiguration notified 8 ReliabilityStrategies that config will be stopped.
TRACE StatusLogger CompositeConfiguration stopping 7 LoggerConfigs.
TRACE StatusLogger CompositeConfiguration stopping root LoggerConfig.
TRACE StatusLogger CompositeConfiguration notifying ReliabilityStrategies that appenders will be stopped.
TRACE StatusLogger CompositeConfiguration stopping remaining Appenders.
DEBUG StatusLogger Shutting down RollingFileManager null
DEBUG StatusLogger Shutting down RollingFileManager null
DEBUG StatusLogger All asynchronous threads have terminated
DEBUG StatusLogger RollingFileManager shutdown completed with status true
DEBUG StatusLogger Shut down RollingFileManager null, all resources released: true
DEBUG StatusLogger Appender RollingFile stopped with status true
TRACE StatusLogger CompositeConfiguration stopped 1 remaining Appenders.
TRACE StatusLogger CompositeConfiguration cleaning Appenders from 8 LoggerConfigs.
DEBUG StatusLogger Stopped org.apache.logging.log4j.core.config.composite.CompositeConfiguration@40575bb9 [configurations=[XmlConfiguration[location=/usr/mware/jwsAppDetails/app1/webapps/myProject/WEB-INF/classes/log4j2-base.xml], XmlConfiguration[location=jar:file:/usr/mware/jwsAppDetails/app1/lib/myProject.jar!/log4j2-env.xml]], mergeStrategy=org.apache.logging.log4j.core.config.composite.DefaultMergeStrategy@583fc0cb, rootNode=null, listeners=[], pluginPackages=[], pluginManager=org.apache.logging.log4j.core.config.plugins.util.PluginManager@278307b, isShutdownHookEnabled=true, shutdownTimeoutMillis=0, scriptManager=org.apache.logging.log4j.core.script.ScriptManager@185463aa] OK
TRACE StatusLogger Reregistering MBeans after reconfigure. Selector=org.apache.logging.log4j.core.selector.ClassLoaderContextSelector@77aa3299
TRACE StatusLogger Reregistering context (1/1): '2190fd23' org.apache.logging.log4j.core.LoggerContext@64150381

【问题讨论】:

嗨@zendu,你能成功吗?我也面临同样的情况。 嗨@JPS,我确实在发布这个问题几天后解决了这个问题。从那以后我就离开了这个项目,不记得确切的修复方法了。我已要求仍在该项目上工作的团队在此处发布答案。 那太好了,谢谢!我很期待。 【参考方案1】:

我们尝试了以下方法并且成功了:

    将文件 log4j-base.xml 重命名为 log4j2.xml

    在 log4j2.component.properties 中,将 log4j-base.xml 重命名为 log4j2.xml 如下:

    log4j.configurationFile=log4j2.xml,log4j2-env.xml

【讨论】:

感谢@SukanyaPai,它对我有用。是否有任何文档链接(很高兴了解为什么 log4j2-something.xml 没有被选中)? @skryvets 老实说,我们进行了反复试验来修复它,幸运的是得到了修复。如果有人找到文档的链接,可以上传该链接。

以上是关于如何在 Spring Boot 中使用 Log4J2 复合配置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 将 Log4j 添加到 maven 项目

Spring boot中使用log4j

如何在 Spring Boot 中获取 log4j2.properties 文件以从 pom.xml 读取文件名

在 log4j2.xml 中使用 Spring Boot 应用程序属性

如何使用 Spring Boot 将 log4j.xml、应用程序属性和 jar 外部化?

如何覆盖spring boot BOM的版本