繁体   English   中英

如何将 log4j.xml 用于 spring boot + log4j2 依赖

[英]How to use log4j.xml for spring boot + log4j2 dependency

我有一个带有自定义附加程序的log4j.xml ,例如:

    <appender name="console" class="com.example.MyAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m (%c{1}:%L)"/>
        </layout>
    </appender>

最近我将log4j依赖升级到log4j2 ,但仍然使用这个log4j.xml并且它有效。

现在,我在我的项目中添加了一个 Spring 引导模块。 Spring doc之后,我将pom.xml设置为

        <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>
            <version>2.6.4</version>
        </dependency>

我还为此添加了 arguments -Dlogging.config=log4j.xml -Dlog4j.configuration=log4j.xml -Dlog4j1.compatibility=true

但是我的 Spring 应用程序显示错误并且没有日志 output:

错误 StatusLogger Unknown object org.apache.logging.log4j.core.config.LoggerConfig 类型的“记录器”被忽略:尝试将其嵌套在以下之一中:[“Appenders”、“Loggers”、“Properties”、“Scripts”、“自定义级别”]。

似乎log4j2 lib 无法识别log4j.xml ,这意味着-Dlog4j1.compatibility=true我认为不适用于 Spring Boot。

可以使用任何相关配置或任何解决方法吗? 谢谢。

TL;DR:问题是 Log4j2 有两个 XML 配置工厂(用于 Log4j 1.x 和 Log4j 2.x 格式),2.x 格式具有更高的优先级。 您需要显式设置ConfigurationFactory以使用:

-Dlog4j2.configurationFactory=org.apache.log4j.xml.XmlConfigurationFactory

当一个 Spring Boot 应用程序启动时,Log4j2 配置了两次:

  • 一开始使用Log4j2自动配置 对于这一轮,您只需要设置-Dlog4j1.compatibility=true并调用配置文件log4j.xml以不同方式调用文件并设置-Dlog4j.configuration

  • 当 Spring 的环境准备就绪时,Spring 仅使用 Log4j2 自动配置的一个子集以编程方式重新配置 Log4j2。 这就是为什么这个阶段需要很多手动设置:

    • -Dlogging.config=log4j.xml :Spring 不查找名为log4j.xml的文件,
    • -Dlog4j1.compatibility=true激活 Log4j 1.x 配置工厂,
    • -Dlog4j2.configurationFactory=org.apache.log4j.xml.XmlConfigurationFactory增加 Log4j 1.x XML 配置工厂的优先级。

备注:使用本机 Log4j 1.x 自定义附加程序会使您面临原始 Log4j 1.x 的所有问题(同步和性能)。 例如 Log4j 1.x 在重新配置期间丢失事件(如 Spring Boot 执行的事件),而 Log4j 2.x 则不会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM