DEBUG 日志记录导致 Spring Boot 2.0.3.RELEASE 中出现 StackOverflowError

nic*_*171 5 java spring-boot

我最近将 Spring Boot 应用程序从 1.5.10 升级到 2.0.3,现在面临这个问题:当我添加logging.level.root=DEBUG到我的时application.properties,出现以下异常:

log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardServletEnvironment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "background-preinit" java.lang.StackOverflowError
  at org.slf4j.bridge.SLF4JBridgeHandler.getSLF4JLogger(SLF4JBridgeHandler.java:198)
  at org.slf4j.bridge.SLF4JBridgeHandler.publish(SLF4JBridgeHandler.java:293)
  at java.util.logging.Logger.log(Logger.java:738)
  at java.util.logging.Logger.doLog(Logger.java:765)
  at java.util.logging.Logger.logp(Logger.java:931)
  at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:180)
  at org.apache.juli.logging.DirectJDKLog.debug(DirectJDKLog.java:103)
  at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1154)
  at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
  at org.slf4j.bridge.SLF4JBridgeHandler.getSLF4JLogger(SLF4JBridgeHandler.java:198)
  at org.slf4j.bridge.SLF4JBridgeHandler.publish(SLF4JBridgeHandler.java:293)
  at java.util.logging.Logger.log(Logger.java:738)
  at java.util.logging.Logger.doLog(Logger.java:765)
  at java.util.logging.Logger.logp(Logger.java:931)
  at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:180)
  at org.apache.juli.logging.DirectJDKLog.debug(DirectJDKLog.java:103)
  at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1154)
  at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
  at org.slf4j.bridge.SLF4JBridgeHandler.getSLF4JLogger(SLF4JBridgeHandler.java:198)
  at org.slf4j.bridge.SLF4JBridgeHandler.publish(SLF4JBridgeHandler.java:293)
  ...
Run Code Online (Sandbox Code Playgroud)

这只是一小部分,因为这组堆栈跟踪重复了 100 多次,导致StackOverflowError.

我尝试过的调试步骤:

  • 如果我将日志记录级别更改为其他任何级别,例如INFO,我不会收到异常。
  • SLF4JBridgeHandler在我的pom.xml.
  • 我已确保它SLF4JBridgeHandler位于我的网络应用程序的类路径中。

什么可能导致此问题?

Raj*_*gan 7

我只是引用官方的 slf4j 文档

jul-to-slf4j.jar 和 slf4j-jdk14.jar 不能同时存在

的存在slf4j-jdk14.jar(即 的jul绑定 SLF4J)将强制SLF4J将调用委托给jul。另一方面,通过调用“ ”的存在jul-to-slf4j.jar以及安装,会将记录路由到。因此,如果两个 jar 同时存在(并且已安装),调用将被委托给,记录将被路由到 ,从而导致无限循环。SLF4JBridgeHandlerSLF4JBridgeHandler.install()julSLF4JSLF4JBridgeHandlerslf4jjuljulSLF4J

这就是你的情况所发生的情况。


尝试执行mvn dependency:tree并排除冲突的依赖项。

在我看来,spring-boot擅长管理这样的依赖关系。因此,保持pom.xml干净并减少手动添加的依赖项是有好处的。