Ведение журнала отладки вызывает StackOverflowError в Spring Boot 2.0.3.ОСВОБОЖДАТЬ



Я недавно обновил свое приложение 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 находится на пути к классу моего веб-приложения.


Что может быть причиной этой проблемы?

660   1  

1 ответ:

Я просто процитирую официальную документацию slf4j ,

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 чистым с меньшим количеством добавленных вручную зависимостей.

Comments

    Ничего не найдено.