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
>
扩展的一个拦截器类
1234567891011121314151617181920212223242526272829303132333435363738394041public
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;
}
}
配置spring配置文件applicationContext.xml
1234567891011121314<
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为刚刚新建拦截器所在路径
配置你的日志配置文件,我的项目用的是logback,在logback.xml中配置
12345<!--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式使用的更多相关文章
- 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,但项目打包部署发布到了测试环境和生产环境怎么办?难 ...
随机推荐
- 移动端REM布局方案
引用http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html的方案 下载地址https://github.com/hupan50 ...
- 支付宝开发(一)-认识php openssl RSA 非对称加密实现
获取支付宝公钥 本地服务器生成私钥和公钥 运用php中openssl相关函数加密解密验证身份 以下是php中openssl相关函数实现的验证,来自php官方demo //需要签名的数据 $data = ...
- grunt-npm编译bootstrap源码
因为gmu需要用编译的方式下载,于是联想到bootstrap什么less sass编译 less先学,据说基于js编译和less编译器,安装起来详细, sass据网上介绍基于ruby, 以下为在mac ...
- php验证复选框有效性的示例
本文介绍一个简单的php通过代码验证复选框值的有效性,有需要的可以参考一下 验证复选框的php代码,如下: 复制代码代码如下: <?php /** * 在php中验证复选框的有效性 * ...
- 我的pch文件
/** * 1. RGB背景色 */ #define PPCOLOR_RGB(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue: ...
- AppStore 审核中文版 --- 程序员必看
App Store审核指南中文版(2014.10.11更新) 2014-11-03 程序猿 苹果在9月3日对App Store审核指南进行了重大更新,新添加了扩展.HealthKit.HomeKit以 ...
- No Hibernate Session bound to thread, and configuration does not allow creat
No Hibernate Session bound to thread, and configuration does not allow creat 今天遇到这么一个错误,在网上差了很多都没有能解 ...
- 一个奇怪的编码 big5-hkscs
# --*-- coding:utf-8 --*-- import urllib2 import urllib postDict = { 'IsExist_Slt_Part_Id': 'False', ...
- bzoj 3858: Number Transformation 暴力
3858: Number Transformation Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 82 Solved: 41[Submit][Sta ...
- poj 1284 Primitive Roots
从来没有接触过完全剩余系,不会证明,知道看了别人的题解才知道要用欧拉函数: 下面是证明过程: p是奇素数,如果{xi%p | 1 <= i <= p - 1} = {1,2,...,p-1 ...