在我的项目中,我使用logback作为默认记录器。但现在将它集成到另一个基本上是火花项目的项目之后,由于类路径中的多个slf4j绑定,我的记录器得到了类转换异常。
这里的 spark项目(父项目)使用log4j作为默认记录器,它使用SLF4j-LOG4j2.jar进行slf4j实现。
我的项目(子项目)正在使用内部包含SLF4j实现的logback。
我知道问题是因为类路径中有2个StaticBinder类,它是第一个(来自spark的log4jbinder),因为它是默认行为。 但我需要在classpath中的所有罐子。
到目前为止我尝试了什么:
所以最后我想知道我们是否能够在运行时将slf4j绑定更改为logback,还是在没有删除classpath中的任何内容的情况下是否存在任何其他解决方案?
在我的classpath父项目中:
的log4j-1.2.17.jar
slf4j-log4j12-1.7.16.jar(不应删除)
儿童项目:
答案 0 :(得分:1)
你知道log4j-over-slf4j神器吗?您需要将其添加到子项目中,并在您的子项目中将slf4j-log4j12.jar
和log4j-1.2.17.jar
添加到exclude 。这样,从父项目调用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-核心包含传递性)并且还包括logback.xml
文件以配置 cSA 中的日志记录。