已开启DEBUG日志,jOOQ仍不记录执行的SQL查询,原因何在?
以下是具体排查方向:
日志类别配置不准确:jOOQ执行SQL的核心日志输出并非完全依赖顶级
org.jooq节点,实际负责SQL打印的是org.jooq.impl.DefaultExecuteListener。如果仅配置了org.jooq的DEBUG级别,但该子类的日志级别被全局规则覆盖(比如继承了INFO级别),就不会输出日志。另外,带绑定变量的完整SQL语句需要开启TRACE级别,DEBUG级别仅输出不带变量占位符的SQL骨架。Logback全局级别或规则覆盖:若
root日志级别设为INFO及以上,且未明确为org.jooq开启更低级别,或者配置中存在additivity="false"导致子logger的配置失效,都会让DEBUG日志无法输出。同时要检查配置文件中org.jooq的配置是否被后续的其他日志规则覆盖。jOOQ日志桥接依赖冲突:jOOQ默认通过SLF4J对接日志框架,如果项目中同时存在log4j、commons-logging等其他日志依赖,可能导致jOOQ无法正确绑定到Logback。需确保项目只保留
slf4j-api和logback-classic依赖,排除其他日志框架的桥接包。jOOQ执行日志被手动关闭:代码中若通过
Settings.setExecuteLogging(false)关闭了执行日志(比如创建DSLContext时传入该配置),即使Logback级别正确,jOOQ也不会输出SQL日志。检查DSLContext的初始化代码,确认executeLogging是否为true。Logback Appender过滤规则限制:即使
org.jooq的级别是DEBUG,若对应的Appender设置了Filter(比如仅允许INFO及以上级别),或者Appender未关联到org.jooq的logger,日志也无法输出到目标位置。SQL未实际执行:如果仅构建了jOOQ的
Query对象,但未调用execute()、fetch()等触发执行的方法,自然不会产生执行日志。jOOQ版本差异:不同版本的jOOQ日志类别可能存在差异,部分旧版本可能使用
org.jooq.tools.Logger等其他节点,需根据使用的jOOQ版本调整Logback配置。
内容的提问来源于stack exchange,提问作者Per Lundberg

