2014-01-28 41 views
2

在调试日志记录级别,JOOQ记录存储的proc语句,执行时间和结果数。但它不记录存储过程的实际绑定值。我正在与Oracle一起使用JOOQ。 的设置目的是制备如下 -使用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年1月27日23:03:31204 DEBUG [请求-52 R:30 A:400663505008 E: 400663505008 S:400049845008] org.jooq.tools.LoggerListener - 执行查询:begin STATE.CREATE_SESSION(ID_OUT =>?,SERVER =>?);结束;

2014年1月27日23:03:31207 DEBUG [请求-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

我想看到的是包含“绑定值”和实际的过程绑定参数的行。

回答

2

看来,jOOQ 3.2.2的默认记录器LoggerListener未内联绑定独立存储过程调用的值。这是一个错误,应该是固定的:#2987

无论如何,如果你想记录绑定值,你有几种选择:

  1. 启用“跟踪”记录。然后jOOQ会将所有绑定值都记录在新行上。但是这非常详细
  2. 实现您自己的记录器,通过内联绑定值重新呈现Routine对象。这是可以做到这样:

    @Override 
    public void renderEnd(RenderContext ctx) { 
        // [...] 
        log.debug(DSL.using(configuration) 
           .renderInlined(ctx.routine())); 
    } 
    
1

只是对卢卡斯的回答详细一点,这里就是我的当前配置的样子,与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()) 
           ); 
          } 
         } 
        } 
       }; 
      } 
     }) 
);