我使用自定义SqlLogger 解决了这个问题,该SqlLogger 在不注入参数值的情况下记录SQL。
object SafeSqlLogger : SqlLogger {
private val log: Logger = LoggerFactory.getLogger(SafeSqlLogger::class.java)
override fun log(context: StatementContext, transaction: Transaction) {
log.debug(context.sql(TransactionManager.current()))
}
}
我在 logback 配置中禁用了 Exposed 记录器。
<logger name="Exposed" level="OFF"/>
并将记录器添加到我想要记录的事务中。
transaction {
addLogger(SafeSqlLogger)
// query the database
}
结果,我得到了以下日志语句:
[...] DEBUG SafeSqlLogger - INSERT INTO sensitive_table (column1, column2) VALUES (?, ?)
最后写了一个函数,可以用来代替transaction记录事务。
fun <T> loggedTransaction(db: Database? = null, statement: Transaction.() -> T): T {
return transaction(db.transactionManager.defaultIsolationLevel,
db.transactionManager.defaultRepetitionAttempts,
db
) {
addLogger(SafeSqlLogger)
statement.invoke(this)
}
}
希望这对和我有同样问题的人有所帮助。