2014-01-28 67 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()) 
           ); 
          } 
         } 
        } 
       }; 
      } 
     }) 
);