首页 > 解决方案 > 删除 Log4j 并使用 Logback

问题描述

是否可以使用 Logback 而不是 Log4j?我已经从我的所有项目成绩文件中排除了 log4j 依赖项,但是当我构建节点时,log4j 仍然从 Corda-core 引入。

下面是我如何排除 gradle 中的依赖项。

configurations.all {
  exclude group: 'org.apache.logging.log4j', module: 'log4j-api'
  exclude group: 'org.apache.logging.log4j', module: 'log4j-core'
  exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl'
  exclude group: "org.slf4j", module: "jcl-over-slf4j"
  exclude group: 'org.apache.logging.log4j', module: 'log4j-web'
}

然后我将 logback 添加为依赖项

compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'

但是在部署节点并启动它们之后,我可以看到它们仍然使用 log4j 记录器工厂。

    SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/daniel.newton/.capsule/apps/net.corda.node.Corda_3.1-corda/log4j-slf4j-impl-2.9.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/daniel.newton/dev/projects/corda/build/nodes/party/cordapps/trade-input-cordapp-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/daniel.newton/dev/projects/corda/build/nodes/party/cordapps/common-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/daniel.newton/dev/projects/corda/build/nodes/party/cordapps/corda-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

这些日志行表明甚至没有找到 logback。

一条额外的信息是,当我运行与下面的 cordapps 相同的项目之一中存在的测试时,运行良好并成功获取 logback,但运行节点却没有。

标签: log4jcorda

解决方案


选择日志框架的最佳实践是它应该在应用程序级别定义,而不是在库(cordapp)级别。

对于 cordapps,应该使用SLF4JAPI,并将其留给运行时 ( corda.jar) 来决定适当的绑定。corda.jar使用 log4j 实现。也许您需要在 github 上提出一个问题,以便能够切换日志提供程序。


推荐阅读