在调试日志记录级别,JOOQ正在记录存储的proc语句,执行时间和结果数。但它没有记录存储过程的实际绑定值。我正在使用JOOQ和Oracle。 Settings对象的准备如下 -
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 DEBUG [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.LoggerListener - 执行查询:begin STATE.CREATE_SESSION(ID_OUT => ;?,SERVER =>?);端;
2014-01-27 23:03:31,207 DEBUG [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.StopWatch - 执行的查询:总计:2.976ms
2014-01-27 23:03:31,207 DEBUG [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.StopWatch - Finishing:Total:3.186ms,+ 0.209ms < / p>
我希望看到的是包含“with bind values”的行和该过程的实际绑定参数。
答案 0 :(得分:2)
看来jOOQ 3.2.2的默认记录器LoggerListener
没有内联绑定独立存储过程调用的值。这是一个错误,应该修复:#2987
无论如何,如果要记录绑定值,您有几个选项:
实现自己的记录器,使用内联绑定值重新呈现Routine对象。这可以这样做:
@Override
public void renderEnd(RenderContext ctx) {
// [...]
log.debug(DSL.using(configuration)
.renderInlined(ctx.routine()));
}
答案 1 :(得分:1)
请详细说明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())
);
}
}
}
};
}
})
);