我有一个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 。
可以使用任何相关配置或任何解决方案?谢谢。
1条答案
按热度按时间pxiryf3j1#
**TL;DR:**问题是Log4j 2有两个XML配置工厂(用于Log4j 1.x和Log4j 2.x),其中2.x具有较高的优先级。您需要显式设置要使用的
ConfigurationFactory
:当Sping Boot 应用程序启动时,Log4j 2会配置两次:
-Dlog4j1.compatibility=true
并调用配置文件log4j.xml
或以不同的方式调用该文件并设置-Dlog4j.configuration
。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不会。