前言

我们公司现在强制要求每个项目必须集成sqlfx客户端,然后把项目输出的jdbc日志收集到sqlfx服务器端进行分析,根据配置将分析报告以邮件的形式发给相关人员。
但是大家有没有思考过logback为何可以把sql执行时间输出到日志文件中呢?或者有没有遇到过明明把公司的logback.xml(logback-spring.xml)模板复制到项目中了,为啥别的日志都输出好好的,偏偏就没有输出sql相关日志呢?日志文件也生成了,为啥里面没内容呢?

主体

其实logback本身是没有格式化sql输出日志功能的,我们项目能输出sqlfx可以识别的jdbc日志,完全是xxx-log4jdbc-log4j2的功劳。下面我们就基于目前的xxx-log4jdbc-log4j21.17.1-SNAPSHOT版本一起看一下他的真实面目吧(后续代码均基于xxx-log4jdbc-log4j21.17.1-SNAPSHOT)。

1、组件集成

使用公司的logback模板我就不说了(springboot推荐使用logback-spring.xml,并且集成xxx-client-spring-boot-starter3.1.3版本)
同时还需要我们做两件事儿:把连接池驱动改为net.sf.log4jdbc.sql.jdbcapi.DriverSpy(必须),url改为jdbc:log4jdbc:DatabaseTypeName://IP:PORT/DBName?Charset=utf8&currentSchema=SchemaName&AppName=AppName;引入log4jdbc.log4j2.properties配置(springboot项目可以在yml中配置,引入sqlfxClient-3.1.3版本即可),把实际驱动类配置一下。
做完上面这些事儿我们再去跑项目,你就会发现大功告成,sql信息被输出了,那么他咋实现的呢?

2、问题及答案探索

问题1:为啥驱动类要改成net.sf.log4jdbc.sql.jdbcapi.DriverSpy


log4jdbc的驱动类DriverSpy和DatabaseTypeName的驱动类Driver均是集成java.sql.Driver,其实可以把前者理解为统一的一个驱动代理,实际执行sql命令的还是各个数据库的驱动,只不过由log4jdbc在上层代理了一下,这时候他就可以做一些小动作,其中拼接sql占位及sql执行时间就是他做的小动作。

问题2:连接串要改成啥样?


在原连接串的中间加上log4jdbc即可,jdbc:log4jdbc:实际驱动类,例如原串jdbc:DatabaseTypeName://IP:PORT...改成jdbc:**log4jdbc**:DatabaseTypeName://IP:PORT...即可。
DriverSpy类中有个log4jdbcUrlPrefix属性,就是配置前缀的,后面他会截取咱们配置urljdbc:log4的后面部分,你会发现,咦,不就变成原始连接串了吗?写这个工具的人还真是聪明呀!

问题3:驱动类在什么时候在哪儿加载的?


上图可看到DriverSpy类里面有一个静态代码块,首次调用该类时就会触发整个驱动初始化的逻辑

主要还是看这里,我们在log4jdbc.log4j2.properties中配置的驱动会在这里被读取出来并加载,并且会先加载自己本身。

配置项为log4jdbc.drivers,而且看到没有?他支持用英文逗号分隔配置多个

配置文件中直接配置即可

有点儿注意事项

这里针对mysql及oracle增加了特殊配置类


这几个类都继承自net.sf.log4jdbc.sql.rdbmsspecifics.RdbmsSpecifics,里面只有一个主要的formatParameterObject,是用于拼接参数时格式化成对应数据库脚本用的


为啥咱们的sql日志里面带了##^^##这个符号知道了不?奥秘就在这里

问题4:sql执行时间是如何输出的?

其实吧,虽然我不想这样说,但实际上他的底层也是用方法执行结束时的System.currentTimeMillis()减去方法执行开始时的System.currentTimeMillis()来实现的,并且做了格式化,就是这么简单


看看这里的说明,如果启用了日志的开关,则获取连接时返回的是经过封装的连接,若未开启日志开关,则返回真实的连接实例


看到没?红框里面,就是那两个代码起到了输出sql执行时间的关键作用!!!


上图是他的实例化代码


可以看到内部还是做了很多事儿的,并且也记录下来了实际的db连接对象(跟数据库连接池的理念一样,都是缓存下来,以供实际使用的时候代理操作)


里面方法也是挺全的,跟普通的Connection对象没啥区别,只不过内部都是做了适配的


只要连接是经过代理的,那么里面所有的东西就都用代理了


跟ConnectionSpy基本一样,只不过加了用于处理特殊参数的对象


也是做了一层封装,毕竟实现了内一套接口,大家都一样


重中之重就在这里啦 看到红框没?他就是这样帮我们计算脚本执行耗时的


通知logger对象,起床尿尿啦


这里是具体打印步骤,第一个红框里面就是咱们常说的“超过多少毫秒会自动升级为error级别日志”

结语

具体项目怎么配置log4jdbc请参考我的另一篇文章 (内部资料,已隐藏。其实就是一个日志客户端组件,没啥特殊的)
网上关于log4jdbc的一些资料
http://log4jdbc.brunorozendo.com/
https://zacard.net/2015/09/24/log4jdbc20150924/
http://blog.oneapm.com/apm-tech/178.html
https://blog.csdn.net/blueheart20/article/details/26471019

log4jdbc-log4j2浅析(sqlfx客户端采集日志的来源)-java 输出sql执行时间相关推荐

  1. log4jdbc oracle,通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql

    通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql 通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql 说一下配置: 服务器weblogic ...

  2. 从0开始搭建ELK及采集日志的简单应用

    关于ELK的理论介绍.架构图解说,很多博客都有很详细的讲解可以参考.本文主要记录了elk的简单搭建和简单应用. 安装前准备 1.环境说明: IP 主机名 部署服务 10.0.0.101(centos7 ...

  3. filebeat 收集json格式_Filebeat 采集日志实践经验记录

    Filebeat 日志采集工具在日常工作中,使用场景更多的是用来采集Nginx 日志和Java 应用运行的日志了.这里简单记录一下踩到坑,和大家分享. 一.Filebeat 收集Nginx 访问日志 ...

  4. Kafka对接采集日志Flum的集群搭建与部署

    目录 Kafka简介 消息队列 Kafka的应用场景 消息队列的两种模型 Kafka中的重要概念 消费者组 幂等性 Kafka集群搭建 kafka集群部署 kafka启动脚本 Kafka命令行操作 1 ...

  5. 活用sersync实时采集日志

    活用sersync实时采集日志 分类: Linux2012-08-22 13:14229人阅读评论(0)收藏举报 服务器threadpath文件同步numbersfile 最近开发的同事有个需求,让我 ...

  6. 详解log4j2(下) - 按日志级别区分文件输出

    1. 按日志级别区分文件输出 有些人习惯按日志信息级别输出到不同名称的文件中,如info.log,error.log,warn.log等,在log4j2中可通过配置Filters来实现. 假定需求是把 ...

  7. 生成器案例,#采集日志

    生成器: 只要在函数体中看到yield,那么这个函数就是生成器. yield功能: 1:为我们提供了一种自定义迭代器对象的方法 2:yield其实也是一种返回值,他和return的区别就是:他可以返回 ...

  8. 使用Filebeat采集日志结合logstash过滤出特定格式的日志至Elasticsearch

    使用Filebeat采集日志结合logstash过滤出特定格式的日志 文章目录 使用Filebeat采集日志结合logstash过滤出特定格式的日志 ELK搭建 什么是Filebeat 什么是Logs ...

  9. 简书iOS客户端更新日志160201-关注详情页优化/支持海外手机号登录等

    简书更新下载:简书iOS 2.10.3更新/下载链接 现在我们的活动 给简书app写评论送优惠码!送简书包!仍在进行中,下载了app记得给好评哟:)已经给过评价的小伙伴更新评论同样可以参与活动哟- 1 ...

最新文章

  1. 三种方法,用Python轻松提取PDF中的全部图片
  2. linux绑定盘符吗,Linux盘符绑定实现原理.PDF
  3. DISTINCT删除重复数据
  4. java中super()_Java 泛型中 extends 和 super 的区别是什么?
  5. 学生电脑哪个牌子好_贺州腻子粉哪个牌子好
  6. C语言字符串库函数api
  7. wordpressQQ登陆php代码_WordPress实现前台登录功能
  8. pygame里面物体闪烁运动_Pygame-游戏中的运动
  9. 山东省中职信息技术c语言试题及答案,中职计算机专业C语言测试题
  10. List集合的去重问题
  11. 数据 正则化 python_Python数据科学:正则化方法
  12. jenkins显示html样式问题的几种解决方案总结
  13. WCF入门学习3-配置文件与部署iis
  14. 【Tensorflow】tensorboard小结
  15. 【已经解决】TypeError: read_img() missing 1 required positional argument: ‘filename‘
  16. 前端截取视频第一帧作为封面
  17. 将pdf文件缩小的最快速方法,pdf文件变小的方法
  18. 组成计算机硬件系统的基本部分为,组成计算机硬件系统的基本部分有哪些
  19. ios dyld: Library not loaded: @rpath/xxx.framework/xxx 之根本原因
  20. i5处理器学计算机怎么设置,处理器怎么超频 酷睿i3/i5/i7系列CPU超频详细教程 (全文)...

热门文章

  1. 我的计算机找不到资源管理器了,我的电脑工具的工具选项,不见了?怎么办?
  2. 10款idea神级插件,生产力必备神器!
  3. 批量爬起百度图片上的数据代码--python
  4. 【PMP】PMP考试易错点总结和答题技巧总结
  5. 办公自动化:PDF文件合并器,用Python将多个PDF文件进行合并
  6. Python文件处理之seek(), tell()用法
  7. 「炼丹」AutoDL炼丹日记
  8. 高德定位注册Key的问题
  9. 抖音文案标题怎么写,抖音标题怎么写才能上热门:国仁楠哥
  10. 2014华为实习生招聘机试题