如何在 Exposed 中禁用 SQL 参数登录?

How to disable SQL parameters logging in Exposed?

我使用默认的 Exposed 框架配置,它具有框架为数据库调用创建的 SQL 语句的内置日志记录。 结果,我在日志中看到 SQL 语句,格式如下:

[...] DEBUG Exposed - INSERT INTO sensitive_table (column1, column2) VALUES ('PII1', 'PII2')

是否可以在 Exposed 中配置日志记录以隐藏(例如替换为“?”)可能出现在 SQL 语句参数中的敏感信息?

[...] DEBUG Exposed - INSERT INTO sensitive_table (column1, column2) VALUES (?, ?)

我使用自定义 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)
    }
}

希望这对和我有同样问题的人有所帮助。