badqiu

          XPer
          隨筆 - 46, 文章 - 3, 評論 - 195, 引用 - 0
          數(shù)據(jù)加載中……

          log4jdbc日志框架介紹

           

          現(xiàn)大家使用的ibatis,hibernate,spring jdbc的sql日志信息,有一點個缺點是占位符與參數(shù)是分開打印,如果想要拷貝sqlPLSQL Developer客戶端直接執(zhí)行,需要自己拼湊sql。而log4jdbc是在jdbc層的一個日志框架,可以將占位符與參數(shù)全部合并在一起顯示,方便直接拷貝sqlPLSQL Developer等客戶端直接執(zhí)行,加快調(diào)試速度。

          .簡單介紹:

          1.沒有使用log4jdbcsql顯示:

           

          select username,password from bitth_date > ? and age < ? and username = ?

          2.使用log4jdbcsql顯示:

          select username,password from bitth_date > to_date(‘2010-11-11’,’yyyy-mm-dd’) and age < 20 and username = ‘qq2008’ {executed in 2 msec}


          這樣就可以直接拷貝上面的sqlPLSQL直接執(zhí)行. 最后的 {executed in 2 msec} SQL執(zhí)行時間.而如果mysql,日志信息將不會出現(xiàn) to_date()

          .log4jdbc使用:

          1.spring xml配置(攔截需要處理的dataSource連接)

              <bean id="log4jdbcInterceptor" class="net.sf.log4jdbc.DataSourceSpyInterceptor" />
              
          <bean id="dataSourceLog4jdbcAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
                 
          <property name="interceptorNames">
                     
          <list>
                        
          <value>log4jdbcInterceptor</value>        
                     
          </list>
                 
          </property>
                 
          <property name="beanNames">
                     
          <list>
                        
          <value>dataSource</value>
                     
          </list>
                 
          </property>
              
          </bean>

          2.log4j.properties配置:

           

          log4j.logger.jdbc.sqlonly=OFF
          log4j.logger.jdbc.sqltiming
          =INFO
          log4j.logger.jdbc.audit
          =OFF
          log4j.logger.jdbc.resultset
          =OFF
          log4j.logger.jdbc.connection
          =OFF

           

          (日志信息如果全部為off,log4jdbc將不會生效,因此對性能沒有任何影響)

          3.下載slf4j

          log4jdbc需要依賴slf4j日志框架. http://www.slf4j.org/

          三.擴展說明

          DataSourceSpyInterceptor為我自己擴展的一個攔截器類,擴展主要是使用AOP的方式,因為log4jdbc原來的方式不適合我的項目.具體源碼為:

           

           

          import org.aopalliance.intercept.MethodInterceptor;
          import org.aopalliance.intercept.MethodInvocation;
          public class DataSourceSpyInterceptor implements MethodInterceptor {
           
          private RdbmsSpecifics rdbmsSpecifics = null;
           
              
          private RdbmsSpecifics getRdbmsSpecifics(Connection conn) {
                  
          if(rdbmsSpecifics == null) {
                      rdbmsSpecifics 
          = DriverSpy.getRdbmsSpecifics(conn);
                  }
                  
          return rdbmsSpecifics;
              }
              
           
          public Object invoke(MethodInvocation invocation) throws Throwable {
            Object result 
          = invocation.proceed();
            
          if(SpyLogFactory.getSpyLogDelegator().isJdbcLoggingEnabled()) {
                
          if(result instanceof Connection) {
                 Connection conn 
          = (Connection)result;
                 
          return new ConnectionSpy(conn,getRdbmsSpecifics(conn));
                }
            }
            
          return result;
           }
          }

           

          四.相關(guān)下載:

           

          log4jdbc: http://code.google.com/p/log4jdbc/

          另外一個對log4jdbc的擴展: http://code.google.com/p/log4jdbc-remix/

           

           

          posted on 2010-08-20 14:07 badqiu 閱讀(5310) 評論(8)  編輯  收藏

          評論

          # re: log4jdbc日志框架介紹  回復(fù)  更多評論   

          好東東。。。
          2010-08-20 14:22 | melin

          # re: log4jdbc日志框架介紹  回復(fù)  更多評論   

          用p6spy也可以解決此問題
          2010-08-20 16:08 | cxh8318

          # re: log4jdbc日志框架介紹[未登錄]  回復(fù)  更多評論   

          不錯的東西,剛看了。
          還有cxh8318介紹的P6Spy已經(jīng)是2003年到現(xiàn)在沒有更新的東西了。
          而現(xiàn)在都是jdbc4了
          2010-08-20 16:39 | alan

          # re: log4jdbc日志框架介紹  回復(fù)  更多評論   

          借用hibernate sql格式化工具類,把sql格式化一把。這樣可以把hibernate.show_sql設(shè)置為false。

          修改Slf4jSpyLogDelegator類

          out.append(sql);
          out.append(" {executed in ");
          out.append(execTime);
          out.append(" msec}");
          BasicFormatterImpl format = new BasicFormatterImpl();
          return format.format(out.toString());
          2010-08-20 17:05 | melin

          # re: log4jdbc日志框架介紹[未登錄]  回復(fù)  更多評論   

          melin你太有才了,是個不錯的想法。哈!!!
          2010-08-20 18:14 | badqiu

          # re: log4jdbc日志框架介紹  回復(fù)  更多評論   

          log4jdbc 在那個地方可以修改執(zhí)行的sql語句。
          2010-08-22 16:51 | melin

          # re: log4jdbc日志框架介紹[未登錄]  回復(fù)  更多評論   

          非常好的東東,實在太感謝了,哥們兒
          2010-08-23 16:42 | Nicholas

          # re: log4jdbc日志框架介紹[未登錄]  回復(fù)  更多評論   

          非常好,就是下載的時候 還差一點 就是下不來
          2013-08-06 19:56 | 歐陽

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 松江区| 孝义市| 平湖市| 绩溪县| 宝坻区| 万载县| 潞西市| 辽宁省| 绥棱县| 盐津县| 博白县| 北流市| 德庆县| 大邑县| 临邑县| 锡林郭勒盟| 德清县| 岑巩县| 莱芜市| 彩票| 宁陕县| 庆元县| 汉中市| 赫章县| 阜新市| 阳山县| 永和县| 湖口县| 波密县| 天津市| 金华市| 潼南县| 册亨县| 大兴区| 广德县| 安图县| 哈尔滨市| 三门县| 巩义市| 应城市| 德清县|