gradle - 如何在 Spring Boot Gradle : log4j-over-slf4j. jar、slf4j-log4j12.jar 中启用 Log4j 多重绑定(bind)

标签 gradle spring-boot log4j slf4j

尝试在 SpringBoot + Gradle 项目中启用 log4j 的情况比 Maven 少见。所以,这就是我面临的问题:

gradle clean bootRun --stacktrace
:clean
:compileJava
:processResources
:classes
:findMainClass
:bootRun
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/mdesales/.m2/repository/org/slf4j/slf4j-log4j12/1.7.21/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/mdesales/.m2/repository/ch/qos/logback/logback-classic/1.1.7/logback-classic-1.1.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError. 
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
Exception in thread "main" java.lang.ExceptionInInitializerError

问题

最佳答案

Gradle 依赖解析

您可以使用 Gradle 的依赖解析功能来解析要加载的库版本。其中一个错误与要加载的 Log4j 版本有关,该错误来自错误日志中所示的 2 个位置。因此,对于每个库的名称,选择哪个版本应该获胜。

第二部分是完全排除对 spring-boot 日志记录和 logback 经典的依赖关系,它们默认负责为 SpringBoot 设置日志记录。以下 block 对此有所帮助。

configurations.all {
  resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    if (details.requested.name == 'log4j') {
      details.useTarget 'log4j:log4j:1.2.+'
    }
  }
  exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
  exclude group: 'org.springframework.boot', module: 'logback-classic'
}

Log4j 依赖项

最后,要添加的最后一个更改是一组 log4jslf4j 依赖项,它们将帮助您加载依赖项。

  runtime group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21'
  runtime group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.21'
  runtime group: 'org.slf4j', name: 'jul-to-slf4j', version: '1.7.21'
  runtime group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.21'
  runtime group: 'log4j', name: 'log4j', version: '1.2.17'

log4j.xml

将其放在常用目录src/main/resources/下。

在这些到位之后,我得到了我需要的:日志输出是不同的,并且使用我的 log4j.xml 上的属性。

$ SPRING_PROFILES_ACTIVE=dev gradle clean bootRun --stacktrace
:clean
:compileJava
:processResources
:classes
:findMainClass
:bootRun
   2016-08-09 07:20:47,006 0     | INFO  | context.annotation.AnnotationConfigApplicationContext.prepareRefresh#581 ["restartedMain" null] Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@15225245: startup date [Tue Aug 09 07:20:46 PDT 2016]; root of context hierarchy     
   2016-08-09 07:20:47,235 229   | INFO  | internal.util.Version.<clinit>#30 ["background-preinit" null] HV000001: Hibernate Validator 5.2.4.Final     
   2016-08-09 07:20:47,440 434   | INFO  | factory.annotation.AutowiredAnnotationBeanPostProcessor.<init>#155 ["restartedMain" null] JSR-330 'javax.inject.Inject' annotation found and supported for autowiring   

关于gradle - 如何在 Spring Boot Gradle : log4j-over-slf4j. jar、slf4j-log4j12.jar 中启用 Log4j 多重绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38854916/

相关文章:

java - 仅显示选定的 Log4j 调试语句

maven - 当在Team City CI上调用Gradle安装任务时,Maven Artifact 会部署到错误的位置

plugins - 如何使用 Gradle Distribution 插件挑选 ZIP 内容?

amazon-web-services - 如何将 Spring Boot Rest 项目部署到私有(private) AWS API GATEWAY?

java - 是否有一个与/dev/null 等效的文件可以在 Windows 和 Unix 上运行?

java - Perf4j 未正确记录

android - 无法运行程序 “mips64el-linux-android-strip”:error = 2,没有这样的文件或目录

spring - 如何在带有接线的 Spring Boot 应用程序中运行特定的类/实用程序?

java - 如何将 Spring REST 投影与自定义 Controller 一起使用

java - 如何在公共(public)pom中保留版本号并在其他pom文件中使用它(spring maven项目)