Ведение журнала отладки вызывает 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находится на пути к классу моего веб-приложения.
Что может быть причиной этой проблемы?
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