sql日志框架log4jdbc的AOP式使用
log4jdbc.log4j2
参考:1. http://badqiu.iteye.com/blog/743100
2. https://code.google.com/p/log4jdbc/
3. https://code.google.com/p/log4jdbc-log4j2/
- 引入项目依赖
12345
<dependency><groupId>org.bgee.log4jdbc-log4j2</groupId><artifactId>log4jdbc-log4j2-jdbc4</artifactId><version>1.16</version></dependency> 扩展的一个拦截器类
1234567891011121314151617181920212223242526272829303132333435363738394041publicclassDataSourceSpyInterceptorimplementsMethodInterceptor {privateRdbmsSpecifics rdbmsSpecifics =null;privatestaticMethod method =null;privateRdbmsSpecifics 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();}}returnrdbmsSpecifics;}@OverridepublicObject invoke(MethodInvocation invocation)throwsThrowable {Object result = invocation.proceed();if(SpyLogFactory.getSpyLogDelegator().isJdbcLoggingEnabled()) {if(resultinstanceofConnection) {Connection conn = (Connection)result;returnnewConnectionSpy(conn,getRdbmsSpecifics(conn),SpyLogFactory.getSpyLogDelegator());}}returnresult;}}配置spring配置文件applicationContext.xml
1234567891011121314<beanid="log4jdbcInterceptor"class="net.sf.log4jdbc.DataSourceSpyInterceptor"/><beanid="dataSourceLog4jdbcAutoProxyCreator"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><propertyname="interceptorNames"><list><value>log4jdbcInterceptor</value></list></property><propertyname="beanNames"><list><value>dataSource</value></list></property></bean>其中net.sf.log4jdbc.DataSourceSpyInterceptor为刚刚新建拦截器所在路径
配置你的日志配置文件,我的项目用的是logback,在logback.xml中配置
12345<!--log4jdbc --><loggername="jdbc.sqltiming"level="DEBUG"/><loggername="jdbc.sqlonly"level="DEBUG"/><loggername="jdbc.audit"level="ERROR"/><loggername="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式使用的更多相关文章
- AOP日志框架实现
AOP日志框架实现 JDK动态代理实现日志框架 首先,在项目包com.ay.test 下创建业务接口类BusinessClassService,具体代码如下: BusinessC lassServic ...
- 如何有效地记录 Java SQL 日志?
在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate . MyBatis 等.由于各种原因,我们有时会想知道 ...
- 如何有效地记录 Java SQL 日志(转)
在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate . MyBatis 等.由于各种原因,我们有时会想知道 ...
- 幸福框架:用户想看到的操作日志也要使用AOP吗?
背景 日志无论是对于开发人员.运维人员和最终用户都是一笔财富,是不是所有类型的日志都要AOP呢?本着交流的目的,这里先说一些看法,希望大家多批评. 常见的日志类型 异常日志 概念:记录异常的日志. 考 ...
- SSM整合AOP,日志框架和拦截器
前言 日志是所有系统必不可少的部分,而AOP在MVC通常用于监控方法调用,可以生成一个traceid,记录从用户调用到底层数据库的数据链路,帮助监控和排查问题. AOP 现在做一个简单的前置切面,用来 ...
- java框架篇---spring AOP 实现原理
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...
- 一个简单好用的日志框架NLog
之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...
- .net core中的那些常用的日志框架(Serilog篇)
前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...
- 带你掌握Java各种日志框架
一:日志基本概念及框架 1:什么是日志 Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug调试功能来跟踪解决Bug,但项目打包部署发布到了测试环境和生产环境怎么办?难 ...
随机推荐
- 快速排序 javascript实现
Quicksort(快速排序) 是由 东尼·霍尔 所发展的一种排序. 它比其他的Ο(n log n)算法更快, 因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来.当然, ...
- 记录一次mount问题
linux centos 6.5 _64 oracle 11.2g 今天接到一个客户电话说重启了服务器,数据库没有重启来,看了数据库的报错 没有找到control文件的路径,数据库启动到了 unmo ...
- NPOI2.0
今天在使用NPOI2.0读取上传excel文件(excel2010)时,报了一个很奇怪的错误:无效的 URI: 未能分析主机名. 在网上查找了下找到的出错情况跟这个完全不着边际,没有办法只有自己去测试 ...
- 重构技巧 引入Null对象
描述:有两个类,学生类和导师类,学生的导师类可能不存在,因此在获取学生导师名字等信息时都要先判断导师名字是否为空.重构后通过一个空导师类来处理导师为空的相应逻辑. Before # introduce ...
- WPF窗体禁用最大化按钮
禁用WPF窗体的最大化按钮可以使用Windows API改变按钮状态的方法实现.使用GetWindowLong可以得到当前按钮的状态.使用SetWindowLong可以设置按钮的状态.使用SetWin ...
- uboot的mkconfig分析
uboot的mkconfig是一个shell脚本.对于笔者这种Linux学习初学者,不太可能认真的把shell脚本学习一遍.但是,倘若不能理解mkconfig的含义,又很难从整体的理解uboot(我认 ...
- iOS开发 - NSBundle, NSDevice, NSLocale
iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...
- UML类图的6中关系
引用自: http://blog.csdn.net/tianhai110/article/details/6339565 UML类图分为如下四种关系: 1. 泛化 (Generalization) ...
- 如何把关联性的告警智能添加到 Nagios 上?(2)
上节回顾 对于许多 IT 和运维团队来说,Nagios 既是一个福音也是一个诅咒.一方面,Naigos 在 IT 应用的工作领域中,给予了你可以实时查看告警数据的可能性:但是另一方面,Nagios 也 ...
- jQueryEasyUI中DataGrid的height,width,fit,fitColumns属性
height: 600, //不指定则默认垂直包裹,指定了则固定 width:1200,//不指定则水平100%平铺,指定了则固定 fit:false,//true:高度填充父窗体,忽略height属 ...