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,但项目打包部署发布到了测试环境和生产环境怎么办?难 ...
随机推荐
- [翻译][MVC 5 + EF 6] 1:创建数据模型
原文:Getting Started with Entity Framework 6 Code First using MVC 5 1.新建MVC项目: 2.修改Views\Shared\_Layou ...
- IIS原理学习
IIS 原理学习 首先声明以下内容是我在网上搜索后整理的,在此只是进行记录,以备往后查阅只用. IIS 5.x介绍 IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Appl ...
- git ignore已经checked in files
对于untracked file, 可以使用.gitignore 对于已经checked in file,可以使用git update-index #隐藏 git update-index --ass ...
- 高性能网络I/O框架-netmap源码分析
from:http://blog.chinaunix.net/uid-23629988-id-3594118.html 博主这篇文章写的很好 感觉很有借签意义 值得阅读 高性能网络I/O框架-netm ...
- javaScript中with的用法
1 JavaScript中的with语句的作用是为逐级的对象访问提供命名空间式的速写方式, 也就是在指定的代码区域, 直接通过节点名称调用对象 初次接触到with用法,是这样一段代码: 1 2 3 4 ...
- Entity Framework Code First 数据迁移
需要在[工具 --> NuGet 程序包管理器 --> 程序包管理器控制台]中输入三个命令: Enable-Migrations (初次迁移时使用) Add-Migration [为本次迁 ...
- C图书借还示例
以后要搞C了先自己练习一下,系统本身没有太大的实际用途,只是用来磨练编程规范,不足之处还望大家多多指正 .互相交流共同进步. 为了方便只使用了一个 book.c 文件,在vc6 下编译通过,其他编译器 ...
- Centos开启FTP及用户配置
vsftpd作为FTP服务器,在Linux系统中是非常常用的.下面我们介绍如何在centos系统上安装vsftp. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...
- sql 判断一个表的数据不在另一个表中
SELECT a.* FROM a LEFT JOIN b ON a.key = b.key WHERE (b.key IS NULL) end as flag from a select id fr ...
- 修改UISearBar的文字颜色,placehoder颜色及输入框颜色
UISearchBar是我们经常会用到的一个控件-- 它由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField UITextField默认输入字体 ...