如何将 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>

我还为它添加了参数-Dlogging.config=log4j.xml -Dlog4j.configuration=log4j.xml -Dlog4j1.compatibility=true

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

ERROR StatusLogger Unknown object "logger" of type org.apache.logging.log4j.core.config.LoggerConfig is ignored: try nesting it inside one of: ["Appenders", "Loggers", "Properties", "Scripts", "CustomLevels"].

似乎 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 引导应用程序启动时 Log4j2 配置两次:

  • 一开始使用Log4j2 automatic configuration。对于这一轮,您只需要设置 -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.xXML配置工厂

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