log4jdbc.log4j2

参考:1.  http://badqiu.iteye.com/blog/743100
 2.  https://code.google.com/p/log4jdbc/
 3.  https://code.google.com/p/log4jdbc-log4j2/
  1. 引入项目依赖

    1
    2
    3
    4
    5
    <dependency>
        <groupId>org.bgee.log4jdbc-log4j2</groupId>
        <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
        <version>1.16</version>
    </dependency>
  2. 扩展的一个拦截器类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public class DataSourceSpyInterceptor implements MethodInterceptor {
         
        private RdbmsSpecifics rdbmsSpecifics = null
         
        private static Method method = null;
         
        private RdbmsSpecifics getRdbmsSpecifics(Connection conn) {
            if(rdbmsSpecifics == null) {
                try {
                    if (null ==  method) {
                        method = DriverSpy.class.getDeclaredMethod("getRdbmsSpecifics", Connection.class);
                    }
                    method.setAccessible(true);
                    rdbmsSpecifics = (RdbmsSpecifics) method.invoke(null, conn);
                    method.setAccessible(false);
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
            return rdbmsSpecifics;
        
        @Override
        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),SpyLogFactory.getSpyLogDelegator()); 
                    }
                }
                return result;
        }
    }
  3. 配置spring配置文件applicationContext.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <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>

    其中net.sf.log4jdbc.DataSourceSpyInterceptor为刚刚新建拦截器所在路径

  4. 配置你的日志配置文件,我的项目用的是logback,在logback.xml中配置

    1
    2
    3
    4
    5
    <!--log4jdbc -->
    <logger name="jdbc.sqltiming" level="DEBUG"/>
    <logger name="jdbc.sqlonly" level="DEBUG"/>
    <logger name="jdbc.audit" level="ERROR"/>
    <logger name="jdbc.connection" level="DEBUG"/>

    配置说明请参考https://code.google.com/p/log4jdbc-log4j2/ 中的说明4.2.2. Configure the loggers

    现在你的日志文件中就会有优雅的 SQL 语句打印出来了,对原项目基本没有影响

 

PS:

遇到这样的exception :

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.AbstractMethodError: oracle.jdbc.driver.OracleResultSetImpl.isClosed()Z

简单点的解决办法是降低版本:

    <dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc3</artifactId>
<version>1.16</version>
</dependency>

sql日志框架log4jdbc的AOP式使用的更多相关文章

  1. AOP日志框架实现

    AOP日志框架实现 JDK动态代理实现日志框架 首先,在项目包com.ay.test 下创建业务接口类BusinessClassService,具体代码如下: BusinessC lassServic ...

  2. 如何有效地记录 Java SQL 日志?

    在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate . MyBatis 等.由于各种原因,我们有时会想知道 ...

  3. 如何有效地记录 Java SQL 日志(转)

    在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate . MyBatis 等.由于各种原因,我们有时会想知道 ...

  4. 幸福框架:用户想看到的操作日志也要使用AOP吗?

    背景 日志无论是对于开发人员.运维人员和最终用户都是一笔财富,是不是所有类型的日志都要AOP呢?本着交流的目的,这里先说一些看法,希望大家多批评. 常见的日志类型 异常日志 概念:记录异常的日志. 考 ...

  5. SSM整合AOP,日志框架和拦截器

    前言 日志是所有系统必不可少的部分,而AOP在MVC通常用于监控方法调用,可以生成一个traceid,记录从用户调用到底层数据库的数据链路,帮助监控和排查问题. AOP 现在做一个简单的前置切面,用来 ...

  6. java框架篇---spring AOP 实现原理

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  7. 一个简单好用的日志框架NLog

    之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...

  8. .net core中的那些常用的日志框架(Serilog篇)

    前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...

  9. 带你掌握Java各种日志框架

    一:日志基本概念及框架 1:什么是日志 Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug调试功能来跟踪解决Bug,但项目打包部署发布到了测试环境和生产环境怎么办?难 ...

随机推荐

  1. tmux复制到windows剪贴板/粘贴板的坑

    以下所有操作都是在windows下面用putty连接linux centos6的情景下. 一直很纳闷为什么在tmux模式下不能把复制到的文字放到系统的粘贴板里面呢?通过层层阻碍,终于找到了原因. 去掉 ...

  2. jdk环境变量配置(总结)

    进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1.下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是 ...

  3. DOM 文档对象模型

    document 对象(作为对象),是 DOM 的核心作用:对内容,属性,样式等操作属性:title:设置/返回当前文档的标题url:返回当前文档的 urlinnerHTML:获取指定对象内的内容bg ...

  4. H5小内容(六)

    Web Worker   基本内容     单线程与多线程       Worker可以模拟多线程的效果     定义 - 运行在后台的javascript     注意 - 不能使用DOM      ...

  5. vagrant 设置除默认工项目之外的synced_folder一个坑

    vagrant和host共享的目录,模式是以host主机目录为主,vagrant目录为从,所以记住当你新建同步目录的时候一定要先把vagratn目录文件备份一下,不然会被host目录覆盖

  6. OS概论2

    实时系统 实时即表示及时,实时计算可以定义为这样一类计算:系统的正确性,不仅由计算的逻辑结果来确定,而且还取决于产生结果的时间.事实上,实时系统最主要的特征,是将时间作为关键参数,它必须对所接收到的某 ...

  7. Server-Side Access Control

    Firefox 3.5 implements the W3C Access Control specification.  As a result, Firefox 3.5 sends specifi ...

  8. how to develop mobile web

    http://blog.templatemonster.com/2010/05/11/how-make-mobile-website-6-easy-tips/ http://mobile.smashi ...

  9. View以自身中心旋转的代码解惑

    matrix.preTranslate(-centerX, -centerY); matrix.postTranslate(centerX, centerY); 经常在中心旋转的应用中看到这段代码. ...

  10. UVA 10716 Evil Straw Warts Live(贪心)

    Problem D: Evil Straw Warts Live A palindrome is a string of symbols that is equal to itself when re ...