【问题标题】:How to disable SQL parameters logging in Exposed?如何在 Exposed 中禁用 SQL 参数记录?
【发布时间】:2020-12-07 17:47:48
【问题描述】:

我使用默认的 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 (?, ?)

【问题讨论】:

    标签: kotlin kotlin-exposed


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多