Spring Boot中记录SQL语句的方法
技术背景
在Spring Boot应用开发中,为了调试和监控数据库操作,经常需要记录SQL语句。将SQL语句记录到日志文件中,有助于开发者分析数据库操作的执行情况,排查问题。
实现步骤
1. 基本配置
在application.properties
或application.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
| spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
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
|
最佳实践
- 选择合适的日志级别:根据实际需求选择
DEBUG
或TRACE
级别。DEBUG
级别适合记录SQL语句,TRACE
级别适合记录绑定参数值。 - 避免在生产环境中记录敏感信息:如果SQL语句包含敏感信息,如用户密码等,应避免在生产环境中记录这些信息。
- 使用日志框架进行日志管理:使用Logback或Log4j等日志框架,方便对日志进行管理和存储。
常见问题
1. SQL语句只显示在控制台,未记录到日志文件
可能是日志配置文件中没有正确配置日志输出路径或日志级别。检查logging.file
或logging.path
配置项,确保日志文件路径正确。
2. 绑定参数值未显示
在Hibernate 6中,logging.level.org.hibernate.type.descriptor.sql.BasicBinder
可能需要替换为logging.level.org.hibernate.orm.jdbc.bind
。
3. 配置不生效
检查配置文件是否正确加载,是否存在拼写错误。可以在启动应用时查看日志,确认配置是否生效。