我想将 SQL 语句记录到文件中。
我在 application.properties
中有以下属性:
spring.datasource.url=...
spring.datasource.username=user
spring.datasource.password=1234
spring.datasource.driver-class-name=net.sourceforge.jtds.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
security.ignored=true
security.basic.enabled=false
logging.level.org.springframework.web=INFO
logging.level.org.hibernate=INFO
logging.file=c:/temp/my-log/app.log
当我运行我的应用程序时,
cmd> mvn spring-boot:run
我可以在控制台中看到 SQL 语句,但它们没有出现在 app.log 中。该文件仅包含 Spring 的基本日志。
我应该怎么做才能在日志文件中看到 SQL 语句?
尝试在您的属性文件中使用它:
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
这也适用于标准输出:
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
要记录值:
logging.level.org.hibernate.type=trace
只需将此添加到 application.properties
。
spring.jpa.properties.hibernate.type=trace
?
而不是参数。该解决方案是否应该向我展示?
这对我有用(YAML):
spring:
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
logging:
level:
org:
hibernate:
type: trace
show_sql: true
属于jpa
要避免的设置
您不应使用此设置:
spring.jpa.show-sql=true
show-sql
的问题在于 SQL 语句是在控制台中打印的,因此无法像您通常使用 Logging 框架那样过滤它们。
使用休眠日志
在您的日志配置文件中,如果您添加以下记录器:
<logger name="org.hibernate.SQL" level="debug"/>
然后,Hibernate 将在创建 JDBC PreparedStatement
时打印 SQL 语句。这就是为什么将使用参数占位符记录语句的原因:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
如果要记录绑定参数值,只需添加以下记录器:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
设置 BasicBinder
记录器后,您将看到绑定参数值也被记录:
DEBUG [main]: o.h.SQL - insert into post (title, version, id) values (?, ?, ?)
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [1] as [VARCHAR] - [High-Performance Java Persistence, part 1]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [2] as [INTEGER] - [0]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [3] as [BIGINT] - [1]
使用数据源代理
datasource-proxy OSS 框架允许您代理实际的 JDBC DataSource
,如下图所示:
https://i.stack.imgur.com/c67Gb.png
您可以定义 Hibernate 将使用的 dataSource
bean,如下所示:
@Bean
public DataSource dataSource(DataSource actualDataSource) {
SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
loggingListener.setQueryLogEntryCreator(new InlineQueryLogEntryCreator());
return ProxyDataSourceBuilder
.create(actualDataSource)
.name(DATA_SOURCE_PROXY_NAME)
.listener(loggingListener)
.build();
}
请注意,actualDataSource
必须是您在应用程序中使用的 connection pool 定义的 DataSource
。
接下来,您需要在日志框架配置文件中将 net.ttddyy.dsproxy.listener
日志级别设置为 debug
。例如,如果您使用 Logback,则可以添加以下记录器:
<logger name="net.ttddyy.dsproxy.listener" level="debug"/>
启用 datasource-proxy
后,SQL 语句将按如下方式记录:
Name:DATA_SOURCE_PROXY, Time:6, Success:True,
Type:Prepared, Batch:True, QuerySize:1, BatchSize:3,
Query:["insert into post (title, version, id) values (?, ?, ?)"],
Params:[(Post no. 0, 0, 0), (Post no. 1, 0, 1), (Post no. 2, 0, 2)]
datasource-proxy
到底意味着什么?是另一种配置吗?除了使用正确的数据源创建 bean 之外,是否还有其他需要配置的东西?此时我们是否还需要在 log4j.properties 中配置一些东西?
请用:
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
使它对我有用,并且缺少其他答案。谢谢!
如果您有 logback-spring.xml
文件或类似文件,请将以下代码添加到其中:
<logger name="org.hibernate.SQL" level="trace" additivity="false">
<appender-ref ref="file" />
</logger>
这对我行得通。
要获取绑定变量:
<logger name="org.hibernate.type.descriptor.sql" level="trace">
<appender-ref ref="file" />
</logger>
<appender-ref ref="FILE" />
对于 SQL Server 驱动程序(Microsoft SQL Server JDBC 驱动程序),请尝试使用:
logging.level.com.microsoft.sqlserver.jdbc=debug
在您的 application.properties 文件中。
我个人的偏好是设置:
logging.level.com.microsoft.sqlserver.jdbc=info
logging.level.com.microsoft.sqlserver.jdbc.internals=debug
您可以查看这些链接以供参考:
追踪司机操作
“操作方法”指南,7. 日志记录
对 YAML 的已接受答案的翻译对我有用
logging:
level:
org:
hibernate:
SQL:
TRACE
type:
descriptor:
sql:
BasicBinder:
TRACE
logging.level.org.hibernate.SQL: TRACE
logging.level.org.hibernate.type.descriptor.sql.BasicBinder: TRACE
根据 documentation 它是:
spring.jpa.show-sql=true # Enable logging of SQL statements.
登录到标准输出
添加到 application.properties
### To enable
spring.jpa.show-sql=true
### To make the printing SQL beautify
spring.jpa.properties.hibernate.format_sql=true
这是打印 SQL 查询的最简单方法,尽管它不记录准备好的语句的参数。
而且不推荐,因为它不是优化的日志框架。
使用日志框架
添加到 application.properties
### Logs the SQL queries
logging.level.org.hibernate.SQL=DEBUG
### Logs the prepared statement parameters
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
### To make the printing SQL beautify
spring.jpa.properties.hibernate.format_sql=true
通过指定上述属性,日志条目将被发送到配置的日志附加器,例如 log-back 或 Log4j。
如果要查看用于查询的实际参数,可以使用
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql=TRACE
然后注意实际参数值显示为 binding parameter
...:
2018-08-07 14:14:36.079 DEBUG 44804 --- [ main] org.hibernate.SQL : select employee0_.id as id1_0_, employee0_.department as departme2_0_, employee0_.joining_date as joining_3_0_, employee0_.name as name4_0_ from employee employee0_ where employee0_.joining_date=?
2018-08-07 14:14:36.079 TRACE 44804 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [TIMESTAMP] - [Tue Aug 07 00:00:00 SGT 2018]
我们可以在 application.properties 文件中使用其中任何一种:
spring.jpa.show-sql=true
例子:
//Hibernate: select country0_.id as id1_0_, country0_.name as name2_0_ from country country0_
或者
logging.level.org.hibernate.SQL=debug
例子:
2018-11-23 12:28:02.990 DEBUG 12972 --- [nio-8086-exec-2] org.hibernate.SQL : select country0_.id as id1_0_, country0_.name as name2_0_ from country country0_
您可以简单地在 application.properties 中为 stdout SQL 查询添加以下行:
spring.jpa.properties.hibernate.show_sql=true
在文件 application.properties 中使用此代码:
# Enable logging for configuration troubleshooting
logging.level.org.hibernate.SQL=DEBUG
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
如果您在使用此设置时遇到问题,并且它似乎有时有效,有时无效 - 请考虑它不工作的时间是否是在单元测试期间。
许多人通过在测试继承层次结构中某处声明的 @TestPropertySources
注释来声明自定义测试时属性。这将覆盖您在 application.properties
或其他生产属性设置中输入的任何内容,因此您设置的这些值在测试时会被有效地忽略。
将 spring.jpa.properties.hibernate.show_sql=true
放入 application.properties 并不总是有帮助。
您可以尝试将 properties.put("hibernate.show_sql", "true");
添加到数据库配置的属性中。
public class DbConfig {
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean
entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("dataSource") DataSource dataSource
) {
Map<String, Object> properties = new HashMap();
properties.put("hibernate.hbm2ddl.auto", "validate");
properties.put("hibernate.show_sql", "true");
return builder
.dataSource(dataSource)
.packages("com.test.dbsource.domain")
.persistenceUnit("dbsource").properties(properties)
.build();
}
您只需在 application.properties 中设置 spring.jpa.show-sql=true
。
例如,您可以参考 ConfigServerRepo/application.yaml。
基本方法是在 application.properties
中添加以下行。这将使 Spring Boot 能够记录所有执行的 SQL 查询:
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
第二行用于美化 SQL 语句。
如果要使用记录器,可以使用以下行:
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
第二行用于打印与查询绑定的所有参数。
我们可以在 Spring boot 中使用两种方法记录 SQL 语句: 1:使用记录器 2:标准方法
对于记录器,您应该将此行添加到 application.properties 文件:
logging.level.org.hibernate.SQL=DEBUG
标准方法您应该在 application.properties 文件中添加这些行:
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
在我的 YAML 文件中:
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.type.descriptor.sql: TRACE
Spring Boot 版本:2.3.5.RELEASE
在属性中添加这些。引用Hibernate Show SQL:
# Show SQL statement
logging.level.org.hibernate.SQL=debug
# Show SQL values
logging.level.org.hibernate.type.descriptor.sql=trace
如果您使用的是 JdbcTemplate,请在 application.properties
文件中添加以下内容以记录 SQL 和参数值。
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE
logging.level.org.hibernate.type=TRACE
EclipseLink
而不是Hibernate
的人呢?