文档章节

Mybatis源码研究4:日志框架的实现

FansUnion
 FansUnion
发布于 2015/10/22 10:30
字数 787
阅读 12
收藏 0
点赞 0
评论 0

 一、logging包的概述

本包主要依赖了 Mybatis的reflection包的ExceptionUtil和io包的Resources, 以及第三方的Log4j,Slf4j,CommonsLogging。
 
  Mybatis的其它包大量引用了本包中的类和接口,即严重依赖于本包。
 
 
  从Mybatis自身的包和类来看,logging包对其它包仅有少量的依赖,而其它很多包却对logging包有大量的依赖。


  因此,先从logging包讲起。先易后难是制胜之道。
 
 

二、日志框架核心类和接口


 Log接口定义了4种日志级别,
 
 void error(String s);

 void debug(String s);

 void trace(String s);

 void warn(String s);
 
 LogFactory工厂类生成Log接口,准确地说,是生成Log接口的实现。
 
 LogException定义了 日志异常,运行时异常。
 
 
三、日志的7种实现

 

 把日志抽象成Log接口,该接口有7种实现。
  1.Apache Commons Logging
  2.JDBC Logging
  3.Java Util Logging
  4.Log4j
  5.No Logging
  6.Slf4J
  7.Stdout
 
 7种实现分别位于logging包的7个子包中:commons,jdbc,jdk14,log4j,nologging,slf4j,stdout。
 
 
 1.commons包下的JakartaCommonsLoggingImpl使用Apache Commons Logging包实现了Log接口。
 
 2.jdbc包下的类 并没有直接实现Log接口,而是将Log接口作为自身的一个属性。
 
 BaseJdbcLogger:代理类的父类,代理类增加了logging功能。
 
 ConnectionLogger, PreparedStatementLogger, ResultSetLogger,StatementLogger都继承了BaseJdbcLogger,
 实现了InvocationHandler 接口。
 
 ConnectionLogger:Connection的代理类,增加了日志功能。
 
 PreparedStatementLogger:PreparedStatement的代理类,增加了日志功能。
 
 ResultSetLogger:ResultSet的代理类,增加了日志功能。
 
 StatementLogger:Statement的代理类,增加了日志功能。
 
 
 
 3.jdk14包下的Jdk14LoggingImpl 使用java.util.logging.Logger和java.util.logging.Level 2个类实现了Log接口。
 
 4.log4j包下的Log4jImpl 使用 Log4J包实现了 Log接口。
 
 5.nologging包下的NoLoggingImpl 空实现了 Log接口,即Log接口的实现方法没有意义,或者没有任何代码。
 
 6.slf4j包下的Slf4jImpl,Slf4jLocationAwareLoggerImpl,Slf4jLoggerImpl 都使用Slf4J包 实现了 Log接口。
 
 7.stdout包下的StdOutImpl使用 System.err.println(s)和System.out.println(s) 实现了Log接口。
 
 
 
 四、日志工厂


 日志工厂类:LogFactory,提供日志接口的实现。
 
 在静态代码块中 加载所有的log实现类,
 mybatis会按以下顺序依次找有没有这个日志类,找到就用这个日志

SLF4J->Apache Commons Logging->Log4J->JDK logging->No Logging

 

获取Log接口的实现类的方法。
public static Log getLog(Class<?> aClass);

public static Log getLog(String logger) ;


五、值得探讨的几个问题:

在这个工厂类里我们可以非常容易地感觉到“坏味道”:
 
  1.在catch块中什么都不做,这是应该尽量避免出现的情况。
 
  2.在static块中会尝试依次加载所有的log实现类,这点也是值得商榷的。
 
  3.因为在一个系统中一般只使用一种日志实现,一次性加载所有的实现只会带来性能问题;
 
  4.还有一个问题就是是否需要动态切换日志实现的功能,至少我觉得这个功能也是个鸡肋。

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 56
博文 857
码字总数 825464
作品 0
丰台
高级程序员

暂无相关文章

如何优雅的编程——C语言界面的一点小建议

我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则。我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化。可是,如果不是直到现在把它们写在纸上,长久以...

柳猫 ⋅ 23分钟前 ⋅ 0

从零手写 IOC容器

概述 IOC (Inversion of Control) 控制反转。熟悉Spring的应该都知道。那么具体是怎么实现的呢?下面我们通过一个例子说明。 1. Component注解定义 package cn.com.qunar.annotation;impo...

轨迹_ ⋅ 23分钟前 ⋅ 0

系统健康检查利器-Spring Boot-Actuator

前言 实例由于出现故障、部署或自动缩放的情况,会进行持续启动、重新启动或停止操作。它可能导致它们暂时或永久不可用。为避免问题,您的负载均衡器应该从路由中跳过不健康的实例,因为它们...

harries ⋅ 25分钟前 ⋅ 0

手把手教你搭建vue-cli脚手架-详细步骤图文解析[vue入门]

写在前面: 使用 vue-cli 可以快速创建 vue 项目,vue-cli很好用,但是在最初搭建环境安装vue-cli及相关内容的时候,对一些人来说是很头疼的一件事情,本人在搭建vue-cli的项目环境的时候也是...

韦姣敏 ⋅ 35分钟前 ⋅ 0

12c rman中输入sql命令

12c之前版本,要在rman中执行sql语句,必须使用sql "alter system switch logfile"; 而在12c版本中,可以支持大量的sql语句了: 比如: C:\Users\zhengquan>rman target / 恢复管理器: Release 1...

tututu_jiang ⋅ 49分钟前 ⋅ 0

Nginx的https配置记录以及http强制跳转到https的方法梳理

Nginx的https配置记录以及http强制跳转到https的方法梳理 一、Nginx安装(略) 安装的时候需要注意加上 --with-httpsslmodule,因为httpsslmodule不属于Nginx的基本模块。 Nginx安装方法: ...

Yomut ⋅ 今天 ⋅ 0

SpringCloud Feign 传递复杂参数对象需要注意的地方

1.传递复杂参数对象需要用Post,另外需要注意,Feign不支持使用GetMapping 和PostMapping @RequestMapping(value="user/save",method=RequestMethod.POST) 2.在传递的过程中,复杂对象使用...

@林文龙 ⋅ 今天 ⋅ 0

如何显示 word 左侧目录大纲

打开word说明文档,如下图,我们发现左侧根本就没有目录,给我们带来很大的阅读障碍 2 在word文档的头部菜单栏中,切换到”视图“选项卡 3 然后勾选“导航窗格”选项 4 我们会惊奇的发现左侧...

二营长意大利炮 ⋅ 今天 ⋅ 0

智能合约编程语言Solidity之线上开发工具

工具地址:https://ethereum.github.io/browser-solidity/ 实例实验: 1.创建hello.sol文件 2.调试输出结果

硅谷课堂 ⋅ 今天 ⋅ 0

ffmpeg 视频格式转换

转 Mp4 格式 #> ffmpeg -i input.avi -c:v libx264 output.mp4#> ffmpeg -i input.avi -c:v libx264 -strict -2 output.mp4#> ffmpeg -i input.avi -c:v libx264 -strict -2 -s 1......

Contac ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部