具有:
Spring-boot:2.6.7
Hibernate:5.6.8
logback
作为默认日志记录实现- Apache POI
poi-ooxml:5.2.3
。
我们需要记录SQL查询和参数。通常这可以从Spring logging configuration中启用:
logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace
或直接在logback.xml
配置中:
<logger name="org.hibernate.SQL" level="debug"/>
<logger name="org.hibernate.type.descriptor.sql" level="trace"/>
两人都在工作,直到最近的POI更新。从POI 5.1.0 it requires log4j2
API开始,不能再从类路径中排除(否则XSSFWorkbook
不能在运行时初始化)。
这导致logback
和log4j2
API类都在类路径中。
同时,Hibernate使用JBoss Logger提供程序(BasicExtractor,BasicBinder),它具有log4j2
优先级。
如果没有log4j
,它可以正常工作并打印SQL和参数,但是一旦log4j2
可用,Spring或logback.xml
配置就会被忽略,并且不再打印debug或trace。
我尝试了以下方法:
- 从POI中排除log4j API:导致运行时异常,因为
XSSFWorkbook
中没有org.apache.logging.log4j.Logger
- 包括
org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0
和org.apache.logging.log4j:log4j-to-slf4j:2.20.0
:没有帮助(logger提供程序仍然是Log4j2LoggerProvider
,Logger实现忽略Spring或logback配置 - 包括
org.slf4j:log4j-over-slf4j:2.0.9
-也不工作
问题:如果logback和slf 4j 2都在classpath中,是否可以将应用程序配置为启用Hibernate类的调试和跟踪?
(类路径中没有logback.xml
和log4j2.xml
文件)
1条答案
按热度按时间3yhwsihp1#
如果你正在使用Sping Boot 的启动器,你没有什么要做的:每个启动器都拉入
spring-boot-starter
,这取决于spring-boot-starter-logging
。后者取决于:logback-classic
,log4j-to-slf4j
,它将Log4j API连接到SLF4J。只要删除所有显式的日志依赖项和排除项,你就应该没事了。删除
log4j-slf4j2-impl
:它的命名是模糊的,但它实际上是从SLF4J到Log4j API的桥梁。如果将它与log4j-to-slf4j
一起部署,它将发出警告并停用自己以防止无限递归。备注:Spring版本的JCL(参见source code)也更喜欢Log4j API而不是SLF 4J。
编辑:我可以提供一些调试技巧:
log4j-api
,则XSSFWorkbook
将在实验中失败。没有必要这样做。log4j-api/log4j-core
工件对的工作方式与slf4j-api/logback-classic
工件对完全相同:log4j-api
和slf4j-api
是API,它们可以同时存在,而log4j-core
和logback-classic
是它们的参考实现,您希望将其中一个替换为另一个API的桥梁,-Dlog4j2.debug=true
并查看应用程序的标准错误,