排除spring-boot-starter-web的Logback依赖关系会阻止log4j系统正确初始化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排除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 app运行时初始化。

这里是排除登录时我遇到的问题:

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
答案

您为什么认为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。

不包括logb​​ack是正确的方法。在排除logback之后,您需要做的只是log4j的配置。

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

以上是关于排除spring-boot-starter-web的Logback依赖关系会阻止log4j系统正确初始化的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat的Maven依赖排除不起作用

springboot中logback和log4j冲突,保留log4j

Spring Boot几种启动问题的解决方案

springboot集成jsp

springboot 使用传统方式部署

SpringBoot使用其他的Servlet容器