Java 需要多个slf4j绑定的解决方案,而无需从类路径中删除其他绑定JAR
在我的项目中,我使用logback作为默认记录器。但现在,在将它集成到另一个项目(基本上是spark项目)之后,我的记录器由于类路径中的多个slf4j绑定而出现类强制转换异常 这里的spark项目(父项目)使用log4j作为默认记录器,并使用SLF4j-LOG4j2.jar实现SLF4j 我的项目(子项目)正在使用包含SLF4j内部实现的logback 我知道问题是因为类路径中有2个StaticBinder类,它使用第一个类(spark的log4jbinder),因为这是默认行为。 但我需要类路径中的所有jar 到目前为止,我所尝试的:Java 需要多个slf4j绑定的解决方案,而无需从类路径中删除其他绑定JAR,java,apache-spark,logging,logback,slf4j,Java,Apache Spark,Logging,Logback,Slf4j,在我的项目中,我使用logback作为默认记录器。但现在,在将它集成到另一个项目(基本上是spark项目)之后,我的记录器由于类路径中的多个slf4j绑定而出现类强制转换异常 这里的spark项目(父项目)使用log4j作为默认记录器,并使用SLF4j-LOG4j2.jar实现SLF4j 我的项目(子项目)正在使用包含SLF4j内部实现的logback 我知道问题是因为类路径中有2个StaticBinder类,它使用第一个类(spark的log4jbinder),因为这是默认行为。 但我需要类路
- 我已经在org.slf4j.impl包中创建了自定义Staticbinder,以便 重定向到我的项目中的logback。但是,当你 将我的项目转换为jar并包含在父项目中
- 尝试了多种方法将Loggercontext更改为使用logback。但不是 成功了
- log4j-1.2.17.jar
- slf4j-log4j12-1.7.16.jar(不应移除)
- slf4j-api-1.7.16.jar
- logback-classic-1.1.8.jar(不应删除)
slf4j-log4j12.jar
和log4j-1.2.17.jar
。这样,父项目对log4j的调用将重定向到slf4j
但是,正如您的问题所指出的,如果是包含在父项目中的子项目,那么您应该不要将您选择的日志框架导出到父项目中,在本例中为logback。您可以通过将子级拆分为一个库部分(包含在父级中)和一个独立的java应用程序部分(依赖于logback)来实现这一点
因此,您的项目结构将变成p(对于父级)、cL(对于子库)和cSA(对于子独立)。P声明对cL加slf4j-log4j12的依赖关系(slf4j api和log4j可传递包含),还包括
log4j.properties
文件以配置P中的日志记录。Project cSA声明对cL加logback classic的依赖关系(slf4j api和logback core可传递包含)还包括logback.xml
文件以配置cSA中的登录 为什么在其他项目中使用依赖项时不能将其排除在外?我假设(并希望)您正在使用一个像maven或gradle这样的工具,它具有完全用于此目的的排除功能。但是如果我们在我的项目中排除logback,那么现有的logback配置将不起作用。您是否使用ivy、gradle或maven之类的工具?是的,我在我的项目中使用maven…在父项目中,他们使用gradle。。。但是排除在外的东西在这里是行不通的。。因为我们两者都需要..您需要做出选择,或者您的所有项目都需要使用logback,或者您需要为另一个项目编写等效的log4j配置。感谢您的回复。。但问题是,我们无法在使用maven的子项目中排除类路径JAR(在父项目中触发加载)。我只能在子项目中进行更改。我还尝试在依赖项中添加这个jar,但由于循环绑定,它会创建log4jDelegationLoop异常。我知道在不排除slf4j-log4j2.jar的情况下这样做是意料之中的。所以仍然在寻找解决方案。排除是在您的子项目中完成的。在我上面的回答中添加了一个关于如何做的链接。嗨,Ceki,我想我对我的项目的解释不清楚。让我给你解释清楚。。基本上,我的项目是一个独立的jar,其中包括logback作为日志框架。。在这里,我们只有两个用于日志记录的依赖项slf4j API和logback。父项目不作为依赖项包含在我的pom中,以排除其中的临时依赖项。我的父项目基于spark,它基本上使用log4j作为默认的日志框架。在这里,我无法改变任何事情。我将以jar的形式生成我的独立项目,他们将其包含到他们的项目中。我明白了。更新了我的答案。但我们需要生成子项目日志,即使在使用详细模式时将其集成到父项目中。这样我们就可以获得有关子项目中到底发生了什么的一些信息。只是想知道,我们可以通过定制LoggerContext类来实现这一点,该类将logback设置为上下文,或者我们可以在单个项目(子项目)中配置2个记录器?因此,我们将检查loggerfactory并为其设置正确的配置@Ceki再次感谢您在这方面的持续支持。