如何在SpringBoot Gradle上启用Log4j:Log4j-over-slf4j.jar、slf4j-log4j12.jar多个绑定

如何在SpringBoot Gradle上启用Log4j:Log4j-over-slf4j.jar、slf4j-log4j12.jar多个绑定,gradle,spring-boot,log4j,slf4j,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/

尝试在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解决它
  • 如何使用log4j1.x代替Log4j2,如中所述
  • 如何在SpringBoot中原样重用现有的log4j.xml而不做任何更改
渐变依赖项解析 您可以使用Gradle的依赖项解析功能解析要加载的库版本。其中一个错误与要加载的Log4j版本有关,如错误日志所示,这两个版本来自两个位置。因此,对于每个库的名称,选择哪个版本应该获胜

第二点是完全排除spring引导日志和logback classic的依赖项,默认情况下,它们负责为spring引导设置日志。下面的代码块对此有帮助

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依赖关系 最后,要添加的最后一个更改是
log4j
slf4j
依赖项集,它们将帮助您加载依赖项

  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   
$SPRING\u PROFILES\u ACTIVE=dev gradle clean bootRun--stacktrace
:清洁
:compileJava
:进程资源
:班级
:findMainClass
:开机
2016-08-09 07:20:47006 0 | INFO | context.annotation.AnnotationConfigApplicationContext.prepareRefresh#581[“restartedMain”null]刷新org.springframework.context.annotation。AnnotationConfigApplicationContext@15225245:启动日期[2016年8月9日星期二07:20:46 PDT];上下文层次结构的根
2016-08-09 07:20:47235 229 | INFO | internal.util.Version.#30[“background preinit”null]HV000001:Hibernate Validator 5.2.4.Final
2016-08-09 07:20:47440434 | INFO | factory.annotation.AutowiredAnnotationBeanPostProcessor.#155[“restartedMain”null]JSR-330“javax.inject.inject”注释已找到并支持自动布线