在调试日志记录级别,JOOQ正在记录存储的proc语句,执行时间和结果数。但是它没有记录存储过程的实际绑定值。我正在与Oracle一起使用JOOQ。设置对象的准备如下 -
Configuration configuration = new DefaultConfiguration()
.set(new JooqTxConnectionProvider(dataSource))
.set(SQLDialect.ORACLE)
.set(recordMapperProvider)
.set(new Settings()
.withRenderSchema(false)
.withRenderNameStyle(RenderNameStyle.AS_IS)
.withExecuteLogging(false))
.set(new DefaultExecuteListenerProvider(
new CallableStatementExecuteListener()),
new DefaultExecuteListenerProvider(
new LoggingExecuteTimeListener(configurationManager)));
记录输出显示如下 -
2014-01-27 23:03:31,204调试[请求-52 r:30 a:400663505008 E:400663505008 S:400049845008] org.jooq.jooq.tools.tools.loggerlistener-?,服务器=>?);结束;
2014-01-27 23:03:31,207调试[请求-52 r:30 a:400663505008 E:400663505008 S:400049845008] org.jooq.jooq.tools.tools.stopwatch-
2014-01-27 23:03:31,207调试[请求-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.jooq.tools.tools.stopwatch-/p>
我想看到的是包含"绑定值"的行,而实际绑定参数与过程。
看来JOOQ 3.2.2的默认记录器LoggerListener
不嵌入独立存储过程调用的绑定值。这是一个错误,应该修复:#2987
无论如何,如果要记录绑定值,则有几个选择:
- 启用"跟踪"记录。然后,JOOQ将在新行上记录所有绑定值。但这很冗长
-
实现自己的记录仪,该记录器将用内联绑定值重新呈现例程对象。可以这样做:
@Override public void renderEnd(RenderContext ctx) { // [...] log.debug(DSL.using(configuration) .renderInlined(ctx.routine())); }
只是为了详细介绍Lukas的答案,这是我当前的配置的样子,使用JOOQ 3.1.0,包括此记录错误的解决方法:
DSLContext create = DSL.using(
new DefaultConfiguration()
.set(new DataSourceConnectionProvider(dataSource))
.set(SQLDialect.ORACLE)
.set(
new org.jooq.conf.Settings()
.withRenderFormatted(true)
.withExecuteLogging(false)
)
.set(new ExecuteListenerProvider() {
@Override
public ExecuteListener provide() {
return new LoggerListener() {
@Override
public void renderEnd(ExecuteContext ctx) {
super.renderEnd(ctx);
JooqLogger log =
JooqLogger.getLogger(LoggerListener.class);
if (log.isDebugEnabled()) {
if (ctx.routine() != null) {
log.debug(
DSL.using(ctx.configuration())
.renderInlined(ctx.routine())
);
}
}
}
};
}
})
);