有:
Spring-boot:2.6.7
Hibernate:5.6.8
logback
作为默认日志记录实现poi-ooxml:5.2.3
。我们需要记录 SQL 查询和参数。通常这可以通过 Spring 日志配置启用:
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 开始,它需要
log4j2
API 并且不能再从类路径中排除(否则 XSSFWorkbook
无法在运行时初始化)。
这导致
logback
和 log4j2
API 类都在类路径中。
同时 Hibernate 使用 JBoss Logger 提供程序(BasicExtractor、BasicBinder),它具有
log4j2
优先级。
如果没有
log4j
,它可以正常工作并打印 SQL 和参数,但是一旦 log4j2
可用,Spring 或 logback.xml
配置都会被忽略,并且不再打印调试或跟踪。
我尝试了以下方法:
org.apache.logging.log4j.Logger
在 XSSFWorkbook
org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0
和org.apache.logging.log4j:log4j-to-slf4j:2.20.0
:没有帮助(记录器提供程序仍然是Log4j2LoggerProvider
并且Logger实现忽略Spring或logback配置org.slf4j:log4j-over-slf4j:2.0.9
- 也不起作用问题:如果 logback 和 slf4j2 都在类路径中,是否可以配置应用程序以启用 Hibernate 类的调试和跟踪?
(类路径中没有
logback.xml
和 log4j2.xml
文件)
如果您使用 Spring 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(参见源代码)也更喜欢 Log4j API 而不是 SLF4J。