Spring-Boot 项目 log4j 到 log4j2 转换问题
Posted
技术标签:
【中文标题】Spring-Boot 项目 log4j 到 log4j2 转换问题【英文标题】:Spring-Boot project log4j to log4j2 conversion Issue 【发布时间】:2017-01-20 19:49:00 【问题描述】:我正在将我的日志框架从 log4j 升级到 log4j2。我已按照 apache 家伙 here 的步骤进行操作。
-
我将 log4j.xml 修改为新标准(尤其是 Appenders)
已将我的 gradle 文件升级到新的依赖项
重建我的 spring-boot 打包器项目并部署它
我在部署 jar 时使用这些系统属性:
java Dspring.profiles.active=dev -Dlog4j.configurationFile=log4j2.xml -jar application.jar
但是,我的应用程序继续运行 log4j 而不是 log4j2。在设置调试属性Dlog4j.debug
时可以看到log4j 正在尝试查找xml、属性等,然后说
No appenders could be found for logger. See http://logging.apache.org/log4j/1.2/faq.
所以我在某个地方选择了 1.2 版?
我相信 log4j2 正在运行的唯一原因是当我将 log4j2.xml 的名称更改为 log4j.xml 时,我收到一条 log4j 警告说明
log4j2.xml could not be found. Only displying error messages to the console.
尽管 log4j 会随之吐出消息。
有人在从 log4j 和 log4j2 切换时遇到类似的情况,可以提供一些帮助吗?
【问题讨论】:
Gradle 中的依赖项是什么样的? Log4j2 (spring-boot-starter-log4j2
) 现在有一个启动器,并且“可能”您可能还必须排除 spring-boot-starter-logging
(当然取决于其他依赖项)。
是的,我有spring-boot-starter-log4j2
并排除了spring-boot-starter-logging
我还有org.apache.logging.log4j log4j-api
【参考方案1】:
这适用于 Gradle 3.2.1 和 Spring Boot 1.4.2。
-
您必须导入
spring-boot-starter-log4j2
并排除spring-boot-starter-logging
将log4j.xml
重命名为log4j2.xml
并进行相应修改(我想你已经这样做了)
复制/包含src/main/resources
中的log4j2.xml
文件或使用-Dlogging.config
引用它(不是您使用的log4j.configurationFile
,因为它是一个Spring Boot 应用程序)
最后,您的 Gradle 配置文件应如下所示(摘录):
buildscript
repositories
mavenLocal()
dependencies
classpath('io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE')
classpath('org.springframework.boot:spring-boot-gradle-plugin:1.4.2.RELEASE')
plugins
// ...
//apply from: 'gradle/database.gradle'
apply plugin: 'idea'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
repositories
mavenCentral()
jcenter()
configurations
all*.exclude module: 'spring-boot-starter-logging'
//all*.exclude module: 'jboss-logging-annotations'
//all*.exclude module: 'jboss-logging'
dependencyManagement
imports
mavenBom("org.springframework.boot:spring-boot-dependencies:1.4.2.RELEASE")
dependencies
compile 'com.lmax:disruptor:3.3.5'
compile 'org.springframework.boot:spring-boot-starter-actuator'
compile 'org.springframework.boot:spring-boot-starter-log4j2'
compile 'org.springframework.boot:spring-boot-starter-undertow'
compile 'org.springframework:spring-webmvc'
task wrapper(type: Wrapper)
gradleVersion '3.2.1'
...您的 Log4j 2.x 配置文件应如下所示(这只有登录到控制台的附加程序,并且 DEBUG
级别仅针对此命名空间/包 io.shido
“激活”):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="log-pattern">%dMM-dd-yyyy HH:mm:ss.SSS |- %highlight%5pTRACE=blue, DEBUG=green, INFO=green, WARN=yellow, ERROR=red, FATAL=red in %style%C1:%Lcyan [%style%t#$sys:PIDmagenta] - %m%n</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="$log-pattern" />
</Console>
</Appenders>
<!-- Logger levels: ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF -->
<Loggers>
<AsyncLogger name="io.shido" level="DEBUG" additivity="false" includeLocation="true">
<AppenderRef ref="Console" />
</AsyncLogger>
<Root level="WARN">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
...如果您在src/main/resources
中没有log4j2.xml
文件,那么默认情况下会选择它,或者如果您需要指定其他文件,请使用--logging.config
指令:
$ ./gradlew bootRun -Dspring.profiles.active=default -Dfile.encoding=UTF-8 -Dlogging.config assets/log4j2.xml
【讨论】:
我的 log4j2.xml 在src/main/resources
内,当我使用命令 -Dlogging.config=log4j2.xml
时,我从 FileNotFoundException 中得到 Logging system failed to initialize using configuration from
src/main/resources/log4j2.xml`。我什至尝试使用-Dlogging.config
澄清路径,但仍然找不到文件
对于 log4j2 配置,log4j 的输出应该是 log4j:asdfasdfasf
还是 log4j2:asdfasdfasdf
?
暂时不要使用-Dlogging.config
指令,将文件放在src/main/resources
中看看发生了什么,然后尝试使用-Dlogging.config
调整(也就是“让它工作”)它
该文件在src/main/resources
内,我尝试在不带-Dlogging.config
的情况下运行。我觉得好像我的项目正在运行 log4j 而不是 log4j2,我没有抓住它。
我也收到了一个警告,提示找不到 log4j.dtd 文件,所以我认为 log4j2 甚至没有运行。以上是关于Spring-Boot 项目 log4j 到 log4j2 转换问题的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot application.properties 文件可以与 log4j2.xml 配置一起工作吗?