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

我最近将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应用程序的类路径中。
  • 是什么导致此问题?

    参考方案

    我只引用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的干净非常好。

    Spring Boot:java.time.Duration的默认序列化从字符串更改为数字 - java

    我们最近从Spring Boot 2.1.9升级到2.2.1,这导致我们的测试失败。调查导致结果,默认情况下java.time.Duration类型现在序列化为不同的序列。现在,我们将得到"PT15M",而不是在JSON消息中包含字符串"900.0"。 POJO定义如下所示@JsonProperty(required …

    从Spring Boot Application检查Keycloak中的密码是否有效 - java

    我的用户已经使用有效的令牌登录,但是在一些重要的操作(如确认或取消付费订阅)中,我希望它与其他数据一起发送密码,以便服务器对其进行验证。到目前为止,我的应用程序已将用户存储在数据库中,并且以这种方式进行开发很容易。如何检查用户正确发送的密码?我需要尝试在后端使用用户名和密码登录吗? 参考方案 您的后端应该已经设置为Keycloak客户端,以便它可以传递令牌进…

    Spring Boot-使用上下文路径时在根级别的静态内容 - java

    假设我有一个application.yml内容server: port: 8000 context-path: /rest 因此,将像这样访问所有控制器和htmlhttp://server:8000/rest/controller因此,具有此配置...有可能在不更改其上下文路径的情况下将一些静态html元素添加到其根级别? (我已经将index.html添加…

    Java:正则表达式模式匹配器是否有大小限制? - java

    我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …