Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要多个slf4j绑定的解决方案,而无需从类路径中删除其他绑定JAR_Java_Apache Spark_Logging_Logback_Slf4j - Fatal编程技术网

Java 需要多个slf4j绑定的解决方案,而无需从类路径中删除其他绑定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),因为这是默认行为。 但我需要类路

在我的项目中,我使用logback作为默认记录器。但现在,在将它集成到另一个项目(基本上是spark项目)之后,我的记录器由于类路径中的多个slf4j绑定而出现类强制转换异常

这里的spark项目(父项目)使用log4j作为默认记录器,并使用SLF4j-LOG4j2.jar实现SLF4j

我的项目(子项目)正在使用包含SLF4j内部实现的logback

我知道问题是因为类路径中有2个StaticBinder类,它使用第一个类(spark的log4jbinder),因为这是默认行为。 但我需要类路径中的所有jar

到目前为止,我所尝试的:

  • 我已经在org.slf4j.impl包中创建了自定义Staticbinder,以便 重定向到我的项目中的logback。但是,当你 将我的项目转换为jar并包含在父项目中
  • 尝试了多种方法将Loggercontext更改为使用logback。但不是 成功了
最后,我想知道我们是否能够在运行时将slf4j绑定更改为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再次感谢您在这方面的持续支持。