首页 > 解决方案 > 从 spring-boot-starter-web 中排除 Logback 依赖项会阻止 log4j 系统正确初始化

问题描述

我以前遇到过 spring 应用程序的多个绑定错误的问题,我了解到修复是排除 spring-boot-starter-web 依赖项的一个组件。我现在遇到的问题是 log4j 想要被初始化,但是 logback-classic 依赖。

这是我最初遇到的错误:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/.m2/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]

我不能排除 slf4-log4j12 依赖,因为它是该模块运行所必需的,并且不能排除 logback 依赖,因为它需要在 spring 应用程序运行时进行初始化。

这是我在排除 logback 时遇到的问题:

log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardServletEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

这是我排除 slf4j-log4j 时得到的错误:

Exception in thread "main" java.lang.AbstractMethodError: org.springframework.boot.context.config.ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)Z

标签: javaspring-bootmavenlog4jslf4j

解决方案


为什么你认为 logback 是一个依赖项?

logback 直接实现 slf4j,你通过 sl4j api 使用 logback,所以你的代码永远不会依赖 logback,但它可能依赖于 slf4j。

您在此处概述的问题:

log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardServletEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

是您的项目没有为 log4j 指定配置的结果。

库 slf4j-log4j12-1.6.1.jar 是 log4j 的 sl4j 绑定。这意味着任何使用 slf4j 的代码日志都会将其日志转发到 log4j。

排除 logback 是正确的方法。排除 logback 后,您需要的只是 log4j 的配置。

请参阅有关如何指定配置的log4j 文档。如果您认为项目具有现有配置,请查找 log4j.properties 或 log4j.xml 文件。确保它们在类路径上。这里问了一个类似问题的问题:log4.properties 应该在类路径上吗?


推荐阅读