当 logback 和 log4j 都在类路径中时,Hibernate 调试/跟踪日志记录

问题描述 投票:0回答:1

有:

  • Spring-boot:2.6.7
  • Hibernate:5.6.8
  • logback
    作为默认日志记录实现
  • 阿帕奇 POI
    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 提供程序(BasicExtractorBasicBinder),它具有

log4j2
优先级

如果没有

log4j
,它可以正常工作并打印 SQL 和参数,但是一旦
log4j2
可用,Spring 或
logback.xml
配置都会被忽略,并且不再打印调试或跟踪。

我尝试了以下方法:

  • 从 POI 中排除 log4j API:导致运行时异常,因为
    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 hibernate apache-poi log4j2 logback
1个回答
0
投票

如果您使用 Spring Boot 的启动器,则无需执行任何操作:每个启动器都会拉入

spring-boot-starter
,这取决于
spring-boot-starter-logging
。后者取决于:

  • logback-classic
    ,
  • 每个主要日志记录 API 和 SLF4J(Logback 的本机 API)之间的正确桥梁。其中有
    log4j-to-slf4j
    ,它将 Log4j API 连接到 SLF4J。

只需删除所有显式日志记录依赖项和排除项,就可以了。你应该特别删除

log4j-slf4j2-impl
:它的命名不明确,但它实际上是从 SLF4J 到 Log4j API 的桥梁。如果您将其与
log4j-to-slf4j
一起部署,它将发出警告并自行停用以防止无限递归。

备注:Spring 版本的 JCL(参见源代码)也更喜欢 Log4j API 而不是 SLF4J。

© www.soinside.com 2019 - 2024. All rights reserved.