首页 > 解决方案 > 我们如何在 hibernate 5 和 payara 5 [glassfish] 中记录 sql 语句

问题描述

我被迫应用这个问题,因为其他记录的所有内容都不起作用。

目标:记录在数据库中执行的 SQL 语句及其有界变量。

环境:Payara 5.182、Hibernate 5.3.2、带有 Logback 的 SLF4j。

似乎官方的方法不是触摸persistence.xml来启用休眠日志记录,而是正确配置日志记录框架。

pom.xml

  <!-- Logging -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>

  <logger name="app" level="TRACE"/>

  <logger name="org.hibernate.sql" level="DEBUG">
      <appender-ref ref="STDOUT" />
  </logger>

  <logger name="org.hibernate.type.descriptor.sql" level="TRACE">
      <appender-ref ref="STDOUT" />
  </logger>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>

</configuration>

演示 EJB 仅用于测试一个简单的查询:

@PostConstruct
public void init(){
    logger.info("Startup EJB. Executing demo query....");
    List resultList = em.createQuery("select p from Project p where p.name = ?1")
    .setParameter(1, "test")
    .getResultList();
    int size = resultList.size();
    logger.info("Result list size = {}",size);
}

结果在控制台

Info:   Clustered CDI Event bus initialized
Info:   23:57:31,332 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
23:57:31,333 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
23:57:31,336 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/C:/Users/teohaik/gitProjects/seagle-server/target/seagle-1.0-SNAPSHOT/WEB-INF/classes/logback.xml]
23:57:31,561 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
23:57:31,565 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
23:57:31,613 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
23:57:31,880 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.
23:57:31,880 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
23:57:31,880 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
23:57:31,886 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [seagle] to TRACE
23:57:31,886 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.hibernate.sql] to DEBUG
23:57:31,886 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[org.hibernate.sql]
23:57:31,889 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.hibernate.type.descriptor.sql] to TRACE
23:57:31,889 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[org.hibernate.type.descriptor.sql]
23:57:31,889 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
23:57:31,889 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
23:57:31,889 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
23:57:31,893 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@23351046 - Registering current configuration as safe fallback point

Info:   23:57:31.920 [admin-thread-pool::admin-listener(1)] INFO  

g.u.t.s.services.VersionProvider - Startup EJB. Executing demo query....
g.u.t.s.services.VersionProvider - Result list size = 0

Info:   Initializing Soteria 1.1-b01 for context '/seagle-server'
Info:   Initializing Mojarra 2.4.0-m01.payara-p5 for context '/seagle-server'
Info:   Loading application [seagle] at [/seagle-server]
Info:   OpenAPI document created.
Info:   application was successfully deployed in 12.196 milliseconds.

标签: hibernateloggingjakarta-eeglassfishpayara

解决方案


只是猜测,但org.hibernate.sql应该是org.hibernate.SQL(使用大写 SQL)。

但是第二个记录器org.hibernate.type.descriptor.sql是正确的,至少应该记录参数。我再次猜想hibernate没有正确地选择logback机制。正如https://www.thoughts-on-java.org/hibernate-logging-guide/中解释的那样, hibernate 使用 jboss-logging,它将日志消息路由到 slf4j,但我不确定它是否正确找到 slf4j。我建议删除 slf4j-api 依赖项,因为 logback 已经提供了它。也许这将修复配置。


推荐阅读