我对 Jdbi 相当陌生。 我一直在尝试与 Spring Boot 集成,到目前为止在我的(非常基本的)测试中一切顺利。
我还没有找到一种记录与数据库交互的方法——即在将 Hibernate 的show-sql
为true
时可以获得的相同结果。
我还没有找到一种可视化的方法,所以我期待一个(一组)配置设置,或者像增加某些命名空间的日志级别等。
我知道 Jdbi 使用的是几乎原始的 SQL,但是能够看到框架/库 _says_ 出于调试目的等在做什么总是很好。
强制性 StackOverflow 问题: https ://stackoverflow.com/questions/66431905/log-jdbi-interactions-with-database
我在搜索这个时读过SqlLogger
,但看起来人们必须实际实现一个以该接口为起点的解决方案,而不是默认情况下 Jdbi 已经提供该功能,而消费者(我们开发人员)能够通过设置某个级别和/或根据需要将其打开/关闭来控制该日志记录。
好吧,为了让 jdbi 提供一个 impl,我们需要提供一个单独的模块或对所有大型记录器框架的运行时依赖,尽管我只记得 slf4j 和 log4j atm。 或者你会传递一个像jdbi.setSqlLogger(SqlLogger.standardPattern(myLoggerInstance::info))
这样的工厂,其中参数是一个Consumer<String>
和一个你自己选择的可选的String.format
模式。
我只是看了看我的宠物项目中的记录器,我确实在那里有一些广泛的逻辑,因为我坚持为 SqlObjects 使用不同的 slf4j 记录器实例名称,执行isLevelEnabled
检查后代,并输出边界参数写入日志语句。
而不是我们提供1出实现无限可能的口味是会天长地久讨论的,怎么样在接收一个简化的接口形式的妥协Map<String, String>
已字符串化的声明则params的和SQL语句字符串? 我认为这涵盖了人们从 sql 日志记录中想要的 99%。 您所要做的就是获取您自己的记录器实例(为此,我们还可以提供一个鉴别器对象,例如拥有的 SqlObject,如果有的话),如果需要,检查启用级别,然后使用参数传递参数格式字符串。 我认为,这并不比我们可以提供的任何工厂要简单得多。
同时,这正是我调试进入数据库的 sql 所需的实现,如果它对其他人有帮助的话。
class SqlLoggerImpl : SqlLogger {
private val logger = LoggerFactory.getLogger(this::class.java)
override fun logBeforeExecution(context: StatementContext?) {
if (logger.isDebugEnabled && context != null) {
logger.debug(context.statement.toString())
}
}
}
然后在实例化 JDBI 时
jdbi.setSqlLogger(SqlLoggerImpl())
我们可以包含一个开箱即用的简单 slf4j 实现,因为我们已经依赖它了。
我认为这就是它所需要的。 人们可以通过这些可用的“桥梁”之一将其连接到他们喜欢的日志记录框架中。
此外,还需要在某个预定义的日志记录级别打印查询和值绑定 - debug
或trace
将非常适合这种情况。
@x80486你怎么看#1828?
最有用的评论
好吧,为了让 jdbi 提供一个 impl,我们需要提供一个单独的模块或对所有大型记录器框架的运行时依赖,尽管我只记得 slf4j 和 log4j atm。 或者你会传递一个像
jdbi.setSqlLogger(SqlLogger.standardPattern(myLoggerInstance::info))
这样的工厂,其中参数是一个Consumer<String>
和一个你自己选择的可选的String.format
模式。我只是看了看我的宠物项目中的记录器,我确实在那里有一些广泛的逻辑,因为我坚持为 SqlObjects 使用不同的 slf4j 记录器实例名称,执行
isLevelEnabled
检查后代,并输出边界参数写入日志语句。而不是我们提供1出实现无限可能的口味是会天长地久讨论的,怎么样在接收一个简化的接口形式的妥协
Map<String, String>
已字符串化的声明则params的和SQL语句字符串? 我认为这涵盖了人们从 sql 日志记录中想要的 99%。 您所要做的就是获取您自己的记录器实例(为此,我们还可以提供一个鉴别器对象,例如拥有的 SqlObject,如果有的话),如果需要,检查启用级别,然后使用参数传递参数格式字符串。 我认为,这并不比我们可以提供的任何工厂要简单得多。