现大家使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺点是占位符与参数是分开打印的,如果想要拷贝sql至PLSQL Developer客户端直接执行,需要自己拼凑sql。而log4jdbc是在jdbc层的一个日志框架,可以将占位符与参数全部合并在一起显示,方便直接拷贝sql在PLSQL Developer等客户端直接执行,加快调试速度

一.简单介绍:

1.没有使用log4jdbc前sql显示:

select username,password from bitth_date > ? and age < ? and username = ? 

2.使用log4jdbc后sql显示:

select username,password from bitth_date > to_date(‘2010-11-11’,’yyyy-mm-dd’) and age < 20 and username = ‘qq2008’ {executed in 2 msec} 

这样就可以 直接拷贝上面的sql在PLSQL 直接执行 .  最后的  {executed in 2 msec}  为 SQL 执行时间.而如果mysql,日志信息将不会出现 to_date()

 二.log4jdbc使用:
1.spring xml配置(拦截需要处理的dataSource连接)
<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>

DataSourceSpyInterceptor是一个拦截器类,扩展主要是使用AOP的方式。具体源码为:

/**实现方法拦截器*/
public class DataSourceSpyInterceptor implements MethodInterceptor
{private RdbmsSpecifics rdbmsSpecifics = null;private RdbmsSpecifics getRdbmsSpecifics(Connection conn){if (this.rdbmsSpecifics == null)this.rdbmsSpecifics = DriverSpy.getRdbmsSpecifics(conn);return this.rdbmsSpecifics;}public Object invoke(MethodInvocation invocation) throws Throwable{Object result = invocation.proceed();if (SpyLogFactory.getSpyLogDelegator().isJdbcLoggingEnabled() && (result instanceof Connection)){Connection conn = (Connection)result;return new ConnectionSpy(conn, getRdbmsSpecifics(conn));}return result;}
}
 MySql日期处理:
class MySqlRdbmsSpecifics extends RdbmsSpecifics
{MySqlRdbmsSpecifics(){super();}String formatParameterObject(Object object){if (object instanceof java.sql.Time){return "'" + new SimpleDateFormat("HH:mm:ss").format(object) + "'";}else if (object instanceof java.sql.Date){return "'" + new SimpleDateFormat("yyyy-MM-dd").format(object) + "'";}else if (object instanceof java.util.Date) // (includes java.sql.Timestamp){return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(object) + "'";}else{return super.formatParameterObject(object);}}
}

Oracle日期处理

class OracleRdbmsSpecifics extends RdbmsSpecifics
{OracleRdbmsSpecifics(){super();}String formatParameterObject(Object object){if (object instanceof Timestamp){return "to_timestamp('" + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS").format(object) + "', 'mm/dd/yyyy hh24:mi:ss.ff3')";}else if (object instanceof Date){return "to_date('" + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(object) + "', 'mm/dd/yyyy hh24:mi:ss')";}else{return super.formatParameterObject(object);}}
}

2.log4j.properties配置:

log4j.rootLogger=INFO,stdout,R_ERROR
log4j.logger.asyncAppenders=INFO,stdout,logfileWarnlog4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}] [%c:%L] - %m%n#log4jdbc config
log4j.logger.jdbc.sqlonly=OFF
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.connection=OFF#log4jdbc config endlog4j.logger.org.springframework.beans.factory.support.DefaultListableBeanFactory=ERROR,logfileWarn
log4j.logger.org.springframework.web.servlet.DispatcherServlet=ERROR,logfileWarn
log4j.logger.org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping=ERROR,logfileWarn
log4j.logger.com.shareinfo=DEBUG,logfileWarn#hibernate
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=ERROR#mybatis
log4j.logger.com.ibatis=DEBUG
log4j.logger.org.apache.ibatis.jdbc.ScriptRunner=DEBUG
log4j.logger.org.mybatis.spring=INFO
log4j.logger.org.apache.ibatis=DEBUG,stdoutlog4j.appender.logfileWarn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfileWarn.File=${catalina.base}/logs/warn.log
log4j.appender.logfileWarn.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.logfileWarn.layout=com.netflix.logging.log4jAdapter.NFPatternLayout
log4j.appender.logfileWarn.Append=true
log4j.appender.logfileWarn.layout.ConversionPattern=[%p -> %c:%L] %d{yyyy-MM-dd HH:mm:ss} %m%n
log4j.appender.logfileWarn.Threshold=DEBUGlog4j.appender.R_ERROR=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R_ERROR.Threshold=ERROR
log4j.appender.R_ERROR.File=${catalina.base}/logs/error.log
log4j.appender.R_ERROR.Append=true
log4j.appender.R_ERROR.DatePattern='.'yyyy-MM-dd
log4j.appender.R_ERROR.layout=com.netflix.logging.log4jAdapter.NFPatternLayout
log4j.appender.R_ERROR.layout.ConversionPattern=[%p -> %c:%L] %d{yyyy-MM-dd HH:mm:ss} %m%nlog4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

(日志信息如果全部为off,log4jdbc将不会生效,因此对性能没有任何影响) log4jdbc需要依赖slf4j日志框架

说明:本人于ITEYE创建于2014年,现转移到CSDN

log4jdbc日志框架相关推荐

  1. Java 日志框架适配/冲突解决方案(值得收藏)

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:juejin.cn/post/6945220055399399455 前言 你是否遇到过配置了日志,但打印不出来的情况? 你是 ...

  2. 最牛逼的 Java 日志框架,性能无敌,横扫所有对手.....

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:juejin.cn/post/6945753017878577165 Logback 算是JAVA 里一个老牌的日志框架,从0 ...

  3. 可能是全网最全,JAVA日志框架适配/冲突解决方案,可以早点下班了

    点击关注公众号,Java干货及时送达 你是否遇到过配置了日志,但打印不出来的情况? 你是否遇到过配置了logback,启动时却提示log4j错误的情况?像下面这样: log4j:WARN No app ...

  4. MyBatis 如何兼容所有日志框架?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/zwx900102/ar ...

  5. idea log 不输出error_还在使用console.log()吗?Bunyan:一个简单易用的JS日志框架

    Bunyan是一个简单易用的JS日志框架,可以工作在多种环境下,这里以Nodejs为例说明Bunyan的基本用法.是时候替换console.log的写法了. 安装 npm install --save ...

  6. [转载]java日志框架log4j详细配置及与slf4j联合使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到"build path" 1 2 3 4 5 &l ...

  7. 项目跑到到了日志警告就卡住了_java中的日志框架梳理(以故事的形式呈现)...

    日志算是java工具体系的一个知识点,但又是写代码的时候绕不过去的一个知识点,这篇文章主要是针对于小白,以故事的形式来对目前市场上常见的一些日志框架进行一个介绍和梳理. 阶段一: 从前有一个程序员,名 ...

  8. 各种Java日志框架的比较

    2019独角兽企业重金招聘Python工程师标准>>> Log4j Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件. ...

  9. MyBatis日志到底是如何做到兼容所有常用日志框架的?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 双子孤狼 来源 | https://blog. ...

  10. 框架退出的方法_AOP日志框架实现

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

最新文章

  1. 升级版Mask R-CNN:PANet
  2. uboot的作用和功能
  3. 项目G2SVG.text转换
  4. YTKNetwork源码详解
  5. spring5新特性
  6. project 模板_不会绘制横道图?18个施工进度计划横道图模板,可一键自动生成,方便快捷易操作,直观形象,相当好用...
  7. Python 内置模块之 os
  8. 基于OK6410开发板Uboot源码简单分析
  9. numpy无法导入的问题--ModuleNotFoundError: No module named 'numpy'总结
  10. 技术要求→物理安全→防雷击
  11. DDoSCoin:加密货币奖励用户参与 DDoS 攻击
  12. 90天吃透阿里P8推荐的625页Java编程兵书pdf,直接入职阿里定级P6
  13. 微信小程序点餐系统的设计与实现
  14. [讨论] AUTOCAD二次开发简介
  15. 马原复习知识点背诵-《马克思主义基本原理概论》
  16. Sequence (矩阵快速幂+快速幂+费马小定理)
  17. 【IPS安全策略配置】
  18. 软件项目管理——文档
  19. 计算机硬件的发展经历了电子管时代,计算机硬件的发展经历了电子管时代、晶体管时代、集成电路时代和_______。...
  20. LeetCode二叉树系列——515.最每个树行中找最大值

热门文章

  1. Vue.js仿一个购买火车票的app
  2. 学习方法论---知其所以然(以算法学习为例)
  3. 销售利器:电销机器人提升业绩!
  4. 【文末福利】【重磅】智能未来 —— 人工智能与城乡规划的交叉对话(CSDN深圳城市开发者社区首场线下技术交流活动)
  5. 免费网盘运营商著作权责任探析
  6. Java实现时间转UTC格式:让时间与世界同步!
  7. 机器学习中的数学(下)
  8. 《学姐教我写代码(一)》十道题搞定C语言
  9. idea报红找不到类,但其实类存在
  10. 5G工业互联阶段二:5G产线工控网