调试日志记录在Spring Boot 2.0.3中导致StackOverflowError

时间:2018-07-23 16:51:55

标签: 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)
  ...

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

我尝试过的调试步骤:

  • 如果我将日志记录级别更改为其他任何级别,例如INFO,则不会出现异常。
  • 我在SLF4JBridgeHandler中为pom.xml添加了特定的依存关系。
  • 我确保SLF4JBridgeHandler在我的Web应用程序的类路径中。

什么可能导致此问题?

1 个答案:

答案 0 :(得分:3)

我只引用official slf4j documentation

  

jul-to-slf4j.jar和slf4j-jdk14.jar不能同时出现

     

存在slf4j-jdk14.jar,即jul的绑定   SLF4J,将强制将SLF4J的呼叫委派给jul。在   另一方面,jul-to-slf4j.jar的存在以及安装   通过调用“ SLF4JBridgeHandler”获得SLF4JBridgeHandler.install()中的   会将jul条记录路由到SLF4J。因此,如果两个罐子都存在   同时(并安装了SLF4JBridgeHandler),slf4j个调用   将被委派到jul,并且jul记录将被路由到   SLF4J,导致无休止的循环。

您的案件正在发生什么。


尝试做mvn dependency:tree并排除冲突的依赖关系。

我认为spring-boot擅长管理此类依赖项。因此,保持pom.xml干净且减少手动添加的依赖关系是很好的。