hibernate - 我们如何在 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.
解决方案
只是猜测,但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 已经提供了它。也许这将修复配置。
推荐阅读
- angular - 在一个父应用程序下运行多个单页应用程序
- android - 使用方法扩展和继承时的名称冲突
- vb.net - 如何在单独的行中声明列表
- python - 如何使用 pyqt4 将我的数据设置到 QscrollArea
- wordpress - 在滑块内显示 Woocommerce 产品类别
- apache-kafka - Kafka ProducerInterceptor 可以过滤记录吗?
- javascript - 如何同时运行同一个 React-App 的两个不同版本
- reactjs - 获取反应日历的开始和结束日期
- android - androidx.work.WorkManager :E/WM-EnqueueRunnable 的根本原因是什么:先决条件...不存在;不排队
- java - Java:如何获取空资源文件夹的路径