Spring Boot中记录SQL语句的方法

Spring Boot中记录SQL语句的方法

技术背景

在Spring Boot应用开发中,为了调试和监控数据库操作,经常需要记录SQL语句。将SQL语句记录到日志文件中,有助于开发者分析数据库操作的执行情况,排查问题。

实现步骤

1. 基本配置

application.propertiesapplication.yml文件中进行配置。以下是几种常见的配置方式:

方式一:使用spring.jpa.show-sql

application.properties中添加:

1
2
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

这种方式会将SQL语句打印到控制台,但不会将参数值显示出来,且无法直接控制日志输出到文件。

方式二:使用日志级别配置

application.properties中添加:

1
2
3
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
spring.jpa.properties.hibernate.format_sql=true

在Hibernate 6中,logging.level.org.hibernate.type.descriptor.sql.BasicBinder可能需要替换为logging.level.org.hibernate.orm.jdbc.bind

2. YAML配置示例

如果使用application.yml,可以这样配置:

1
2
3
4
5
6
7
8
9
10
11
spring:
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
logging:
level:
org:
hibernate:
type: trace

3. 使用datasource-proxy

如果需要更详细的日志记录,可以使用datasource-proxy框架。
首先,定义DataSource bean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import net.ttddyy.dsproxy.listener.logging.SLF4JQueryLoggingListener;
import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {
private static final String DATA_SOURCE_PROXY_NAME = "DATA_SOURCE_PROXY";

@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();
}
}

然后,在日志框架配置文件中设置net.ttddyy.dsproxy.listener的日志级别为debug。例如,在Logback中添加:

1
<logger name="net.ttddyy.dsproxy.listener" level="debug"/>

核心代码

配置application.properties示例

1
2
3
4
5
6
7
8
9
10
# 显示SQL语句
spring.jpa.show-sql=true
# 格式化SQL语句
spring.jpa.properties.hibernate.format_sql=true
# 记录SQL语句
logging.level.org.hibernate.SQL=DEBUG
# 记录绑定参数值(Hibernate 5及以下)
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
# 记录绑定参数值(Hibernate 6)
logging.level.org.hibernate.orm.jdbc.bind=TRACE

配置application.yml示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
logging:
level:
org:
hibernate:
SQL: DEBUG
type:
descriptor:
sql:
BasicBinder: TRACE

最佳实践

  • 选择合适的日志级别:根据实际需求选择DEBUGTRACE级别。DEBUG级别适合记录SQL语句,TRACE级别适合记录绑定参数值。
  • 避免在生产环境中记录敏感信息:如果SQL语句包含敏感信息,如用户密码等,应避免在生产环境中记录这些信息。
  • 使用日志框架进行日志管理:使用Logback或Log4j等日志框架,方便对日志进行管理和存储。

常见问题

1. SQL语句只显示在控制台,未记录到日志文件

可能是日志配置文件中没有正确配置日志输出路径或日志级别。检查logging.filelogging.path配置项,确保日志文件路径正确。

2. 绑定参数值未显示

在Hibernate 6中,logging.level.org.hibernate.type.descriptor.sql.BasicBinder可能需要替换为logging.level.org.hibernate.orm.jdbc.bind

3. 配置不生效

检查配置文件是否正确加载,是否存在拼写错误。可以在启动应用时查看日志,确认配置是否生效。


Spring Boot中记录SQL语句的方法
https://119291.xyz/posts/2025-04-21.spring-boot-sql-logging-methods/
作者
ww
发布于
2025年4月22日
许可协议