Spring Data R2DBC连接MySQL时如何同步打印SQL语句与查询参数?
Spring Data R2DBC 打印含绑定参数的完整SQL配置方案
前置场景说明
当前基于MySQL场景的Spring Data R2DBC开发,引入的依赖配置为:
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc' runtimeOnly 'dev.miku:r2dbc-mysql' runtimeOnly 'mysql:mysql-connector-java'
已配置日志规则logging.level.org.springframework.r2dbc: DEBUG,可正常输出SQL模板,但无法展示绑定的参数值,实际日志样例:
o.s.r2dbc.core.DefaultDatabaseClient : Executing SQL statement [select * from project where usr_id = :usrId and start_time BETWEEN :stDate and :endTime]
问题根因
Spring Data R2DBC 框架层的org.springframework.r2dbc包日志,仅负责记录传递的SQL模板文本,不会解析、输出模板中命名占位符对应的实际绑定值。参数值的日志打印逻辑由底层R2DBC驱动实现,仅开启框架层日志无法获取参数值内容。
具体配置方法
追加底层MySQL R2DBC驱动的DEBUG级别日志配置即可,根据使用的配置文件格式选择对应写法:
- YAML格式配置(application.yml)
logging: level: org.springframework.r2dbc: DEBUG dev.miku.r2dbc.mysql: DEBUG
- Properties格式配置(application.properties)
logging.level.org.springframework.r2dbc=DEBUG logging.level.dev.miku.r2dbc.mysql=DEBUG
配置生效效果
配置完成后重启服务,日志将同时输出:
- 框架层打印的原始SQL模板
- 驱动层打印的每个SQL占位符对应的实际绑定参数值、参数类型
- 必要的数据库连接交互执行细节
优化提示
- 如果开启整个驱动包的DEBUG日志后认为冗余日志量过大,可缩小日志生效范围,仅开启参数解析、绑定相关类的DEBUG级别,过滤无关的连接层日志输出。
- 也可尝试将
org.springframework.r2dbc.core的日志级别调整为TRACE,框架层也会输出对应的参数绑定信息,但该方式在部分旧版本的Spring Data R2DBC中支持不完善,日志输出完整性不如驱动层的日志逻辑。 - 额外说明:当前引入的
mysql:mysql-connector-java为JDBC驱动依赖,在纯R2DBC访问MySQL的场景下不会被实际调用,可根据业务需求移除,减少不必要的类加载开销。
内容的提问来源于stack exchange,提问作者user1578872
相关产品推荐
相关产品推荐

