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-logginglog4j.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 - 外部 log4j 配置不起作用

spring-boot配置log4j日志

log4j 在项目中的详细配置

spring-boot application.properties 文件可以与 log4j2.xml 配置一起工作吗?

如何在spring boot中配置log4j写入文件?

Lo4j的配置一