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

rjee0c15  于 2022-11-06  发布在  Spring
关注(0)|答案(1)|浏览(189)

我有一个log4j.xml,带有一个自定义的appender,如:

<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,它工作正常。
现在,我在我的项目中添加了一个Sping Boot 模块。

<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>

我还为它添加了参数-Dlogging.config=log4j.xml -Dlog4j.configuration=log4j.xml -Dlog4j1.compatibility=true
但是我的Spring应用程序显示了错误并且没有日志输出:
错误状态记录器类型为org.apache.logging.log4j.core.config.LoggerConfig的未知对象“记录器”被忽略:请尝试将其嵌套在以下项之一中:[“追加器”、“记录器”、“属性”、“脚本”、“自定义级别”]。
看起来log4j2 lib无法识别log4j.xml,这意味着-Dlog4j1.compatibility=true不适用于我认为的Sping Boot 。
可以使用任何相关配置或任何解决方案?谢谢。

pxiryf3j

pxiryf3j1#

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

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

当Sping Boot 应用程序启动时,Log4j 2会配置两次:

  • 在一开始就使用Log4j 2自动配置。对于这一轮,您只需要设置-Dlog4j1.compatibility=true并调用配置文件log4j.xml以不同的方式调用该文件并设置-Dlog4j.configuration
  • 当Spring的环境准备就绪时,Spring只使用Log4j 2自动配置的一个子集以编程方式重新配置Log4j 2。
  • Spring不会查找名为log4j.xml的文件,
  • -Dlog4j1.compatibility=true以激活Log4j 1.x配置工厂,
  • -Dlog4j2.configurationFactory=org.apache.log4j.xml.XmlConfigurationFactory以提高Log4j 1.x XML配置工厂的优先级。
    备注:使用本机Log4j 1.x自定义appender会使您面临原始Log4j 1.x的所有问题(同步和性能)。例如,Log4j 1.x会在重新配置期间丢失事件(如Sping Boot 所执行的事件),而Log4j 2.x不会。

相关问题