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. leetcode problem (2-4)

    Problem 2 --- Add Two Numbers 简单的模拟题. Problem 3 --- Longest Substring Without Repeating Characters 题 ...

  2. ajax 的基本原理

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  3. onmouseleave与onmouseout区别

    1.onmouseleave.onmouseenter,鼠标进入到指定元素区域内触发事件,不支持冒泡,不包含子元素的区域. 2.onmouseout.onmouseover.鼠标进入指定元素触发事件, ...

  4. 项目规范和建立-从frozenui学习

    1.分支branches开发新功能,主干trunk是稳定发布的.因为frozenui下载完,看到branches比trunk多了一个版本 2.版本号定义,主版本.次版本.修订号 大版本号: 主版本号: ...

  5. SQL函数:小写金额转换成大写

    /********************************************************作者:版本:1.0创建时间:20020227修改时间:功能:小写金额转换成大写参数:n ...

  6. POJ 3371 Flesch Reading Ease 无聊恶心模拟题

    题目:http://poj.org/problem?id=3371 无聊恶心题,还是不做的好,不但浪费时间而且学习英语. 不过为了做出点技术含量,写了个递归函数... 还有最后判断es,ed,le时只 ...

  7. Linux技术修复

    今天在慕课网上学习了Linux的一些知识: 我使用命令: ***:~$ route add default gw 192.168.1.1 添加了一个网关:192.168.1.1之后的结果为: ***: ...

  8. python类的继承

    继承一个类 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object): def __init__(self ...

  9. Central Europe Regional Contest 2012 Problem c: Chemist’s vows

    字符串处理的题目: 学习了一下string类的一些用法: 这个代码花的时间很长,其实可以更加优化: 代码: #include<iostream> #include<string> ...

  10. 怎样在Win7 64位旗舰版安装Python+Eclipse开发环境

    原地址:http://www.cnblogs.com/balian/archive/2011/06/19/2084632.html 自从上周抛弃了WinXP转而安装了Win7,64位后,尝试安装Pyt ...