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

mklgxw1f  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(123)

具有:

  • 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不能在运行时初始化)。
这导致logbacklog4j2 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.0org.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.xmllog4j2.xml文件)

3yhwsihp

3yhwsihp1#

如果你正在使用Sping Boot 的启动器,你没有什么要做的:每个启动器都拉入spring-boot-starter,这取决于spring-boot-starter-logging。后者取决于:

  • logback-classic
  • 每个主要日志API和SLF 4J(Logback的原生API)之间的正确桥梁。其中有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-apislf4j-api是API,它们可以同时存在,而log4j-corelogback-classic是它们的参考实现,您希望将其中一个替换为另一个API的桥梁,
  • 要检查类路径上是否有多个Log4j API实现,请设置-Dlog4j2.debug=true并查看应用程序的标准错误,
  • 要检查是否没有多个SLF4J实现,请检查标准错误。

相关问题