我正在构建一个简单的应用程序,以便可以了解slf4j,桥接库,日志记录实现等。我的应用程序依赖于slf4j,后者将logback用于日志记录实现。另外,它引入了一个包含commons-logging库的库。
应用程序依赖项:
dependencies {
compile project(':library-with-jcl')
compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.25'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
}
库依赖项:
dependencies {
compile group: 'commons-logging', name: 'commons-logging', version: '1.2'
}
当我不包括jcl-over-slf4j
时,该库将按预期方式通过JCL输出其日志记录。当我执行包含jcl-over-slf4j
时,slf4j将通过JCL记录器进行的任何日志记录都提取并重定向到logback。
我一直在Internet上阅读文章,说如果我的应用程序依赖slf4j和依赖JCL的库,则必须排除commons-logging
依赖项。但是,这似乎没有必要,而且我不明白为什么。在什么情况下我必须排除JCL依赖关系?我的例子太简单了,无法暴露潜在的问题吗?
此外,我没有看到建议,例如,如果我使用log4j网桥,则必须从依赖该库的库中排除log4j依赖项。为什么不? JCL是特例吗?
答案 0 :(得分:1)
JCL和SLF都是日志记录的外观,即它们只是一个抽象了日志记录实现的API。
JUL(java.util.logging
)和Logback是日志记录的实现。默认情况下,JCL将调用JUL,SLF将调用Logback。
为什么要使用两个活动的日志记录实现,这些实现需要分别配置,并且必须记录到不同的日志文件中?
您没有,并且您的应用程序选择使用Logback,并且选择JCL应该调用SLF(jcl-over-slf4j
),因此无论代码是调用JCL还是SLF都无关紧要通过Logback完成。
因此,您需要删除(排除)由库依赖项添加的重复JCL门面,该门面现在由jcl-over-slf4j
实现。