如何将 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 不会。
我有一个 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 不会。