如何在Ktor的Exposed框架中屏蔽SQL日志中的参数值?
解决Exposed日志中SQL参数值替换为
?的问题 要实现把Exposed打印的SQL日志里的具体参数替换为?,需要自定义SQL日志处理器,替换掉默认的日志输出逻辑,以下是具体步骤:
1. 实现自定义SQLLogger
创建一个继承自SQLLogger的类,重写log方法,在方法里生成带?占位符的SQL语句:
import org.jetbrains.exposed.sql.Transaction import org.jetbrains.exposed.sql.statements.StatementContext import org.jetbrains.exposed.sql.transactions.TransactionManager import org.slf4j.LoggerFactory class MaskedSqlLogger : org.jetbrains.exposed.sql.SQLLogger { private val logger = LoggerFactory.getLogger("Exposed") override fun log(context: StatementContext, transaction: Transaction) { // 用?替换所有参数值,生成脱敏后的SQL val maskedSql = context.expandArgs { "?" } logger.debug("{}", maskedSql) } }
expandArgs是Exposed提供的工具方法,接受lambda来替换每个参数,这里直接返回?即可完成参数占位。
2. 注册自定义Logger到Exposed
在Ktor应用初始化数据库的位置,注册这个自定义日志处理器,替换默认的日志输出:
// 初始化数据库连接 Database.connect( url = "你的数据库URL", driver = "对应驱动类", user = "用户名", password = "密码" ) // 注册自定义Logger TransactionManager.defaultDatabase?.registerSQLLoggers(MaskedSqlLogger())
3. 确保日志级别配置正确
在你的日志配置文件(比如logback.xml或Ktor的application.conf)中,确保Exposed的日志级别为DEBUG,这样才能输出脱敏后的SQL:
Logback配置示例(logback.xml)
<logger name="Exposed" level="DEBUG" additivity="false"> <appender-ref ref="STDOUT" /> </logger>
Ktor application.conf配置示例
logging { loggers { "Exposed" = DEBUG } }
为什么之前的方案无效?
很多常规方案尝试通过日志框架的过滤规则隐藏参数,但Exposed默认的StdOutSqlLogger是直接把参数值拼接到SQL字符串后再输出的,日志框架拿到的已经是完整的带参数的SQL,无法通过简单过滤替换参数。必须通过自定义SQLLogger,在生成日志内容时就替换参数为?。
内容的提问来源于stack exchange,提问作者Avdhoot Jadhav
相关产品推荐
相关产品推荐

