文档章节

Commons Logging 架构分析

陶邦仁
 陶邦仁
发布于 2015/10/22 10:24
字数 1090
阅读 846
收藏 3

#0 系列目录#

Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。

#1 类图#

  • (1)Commons Logging定义了一个自己的接口 org.apache.commons.logging.Log,以屏蔽不同日志框架的API差异,这里其实就是用到了Adapter Pattern(适配器模式)

输入图片说明

上面的UML类图,只是列出了几个常用的适配器实现类,当前Commons Logging 1.1.1版本已经实现的适配器实现类有:

  1. org.apache.commons.logging.impl.AvalonLogger。
  2. org.apache.commons.logging.impl.Jdk13LumberjackLogger。
  3. org.apache.commons.logging.impl.Jdk14Logger。
  4. org.apache.commons.logging.impl.Log4JLogger。
  5. org.apache.commons.logging.impl.LogKitLogger。
  6. org.apache.commons.logging.impl.NoOpLog。 它很懒,什么也不做,所有给它的日志信息直接丢弃
  7. org.apache.commons.logging.impl.SimpleLog。将日志信息输出至控制台,建议只是用于开发环境,不要用于生产环境。
  • (2)Commons Loggins 通过一个抽象工厂类 LogFactory 实现配置文件的加载解析以及实例化日志框架类。这里面就用到了两个常用的设计模式:Factory Pattern(工厂模式)、Single Pattern(单例模式)

输入图片说明

同时,Commons Logging 实现了一个默认的工厂类 org.apache.commons.logging.impl.LogFactoryImpl,在未指明工厂实现类的情况下就使用它。

有必要详细说明一下调用LogFactory.getLog()时发生的事情调用该函数会启动一个发现过程,即找出必需的底层日志记录功能的实现,具体的发现过程在下面列出:

  1. Commons的Logging首先在CLASSPATH中查找commons-logging.properties文件。这个属性文件至少定义 org.apache.commons.logging.Log属性,它的值应该是上述任意Log接口实现的完整限定名称。如果找到 org.apache.commons.logging.Log属相,则使用该属相对应的日志组件。结束发现过程
  2. 如果上面的步骤失败(文件不存在或属相不存在),Commons的Logging接着检查系统属性 org.apache.commons.logging.Log。如果找到org.apache.commons.logging.Log系统属性,则使用该系统属性对应的日志组件。结束发现过程。
  3. 如果找不到org.apache.commons.logging.Log系统属性,Logging接着在CLASSPATH中寻找log4j的类。如果找到了,Logging就假定应用要使用的是log4j。不过这时log4j本身的属性仍要通过log4j.properties文件正确配置。结束发现过程。
  4. 如果上述查找均不能找到适当的Logging API,但应用程序正运行在JRE 1.4或更高版本上,则默认使用JRE 1.4的日志记录功能。结束发现过程。
  5. 最后,如果上述操作都失败(JRE 版本也低于1.4),则应用将使用内建的SimpleLogSimpleLog把所有日志信息直接输出到System.err。结束发现过程。

以上发现过程,具体源码分析,请参见Commons Logging使用原理

#2 实现原理#

  • (1)完整的配置文件内容:
# 默认值true
org.apache.commons.logging.Log.allowFlawedContext=true
# 默认值true
org.apache.commons.logging.Log.allowFlawedDiscovery=true
# 默认值true
org.apache.commons.logging.Log.allowFlawedHierarchy=true
# 默认值false
use_tccl=false
# 默认值0
priority=0
configId=
# 默认值
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl
org.apache.commons.logging.Log=
org.apache.commons.logging.diagnostics.dest=STDERR

实际中使用的时候只需要配置 org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger,或者其他的适配器实现类以及根据项目实际需要实现的自定义适配器类。

  • (2)使用方法:
private Log logger = LogFactory.getLog(Hello.class);  
或 
private Log logger = LogFactory.getLog("Hello");

它的执行序列图如下:

输入图片说明

  1. 首先从缓存中获取工厂实现类实例,如果没有就读取配置文件中的配置项 org.apache.commons.logging.LogFactory 获取工厂实现类并进行实例化,如果没有配置或者找不到对应的类,就使用默认的工厂类 org.apache.commons.logging.impl.LogFactoryImpl 进行初始化并放入缓存
  2. 根据”name“从缓存中获取日志适配器实现类实例,如果没有就新生成一个并放入缓存

© 著作权归作者所有

陶邦仁
粉丝 1688
博文 420
码字总数 1483887
作品 0
海淀
技术主管
私信 提问
日志框架_Index

2种日志接口框架,4种日志实现框架 jdk-logging、log4j、logback日志介绍及原理 jcl与jul、log4j1、log4j2、logback的集成原理 slf4j与jul、log4j1、log4j2、logback的集成原理 slf4j、jcl、...

陶邦仁
2015/12/05
675
0
commons-logging 和 log4j 之间的关系

我们在做项目时,日志的记录是必不可少的一项任务,而我们通常是使用 apache 的 log4j 日志管理工具。然而,在项目中,我们经常会看到两个 jar 包:commons-logging.jar 和 log4j.rar。为什么...

飓风2000
2014/05/26
1K
4
jcl与jul、log4j1、log4j2、logback的集成原理

1 系列目录 - jdk-logging、log4j、logback日志介绍及原理- jcl与jul、log4j1、log4j2、logback的集成原理- slf4j与jdk-logging、log4j1、log4j2、logback的集成原理- slf4j、jcl、jul、log...

乒乓狂魔
2015/04/29
4.6K
2
Java日志框架-commons-logging

commons-logging是Apache commons类库中的一员。commons-logging自带了日志实现类,但是功能比较简单,更多的是将其作为门面,底层实现依赖其它框架。commons-logging能够选择使用Log4j还是J...

禾禾元元
2018/06/07
0
0
log4j+commons-logging结合使用

1.参考文献: Apache Commons-logging使用实例 Apache Log4j配置说明 log4j.properties配置详解 commons-logging结合Log4j的问题 Properties文件相关 Apache通用日志工具commons-logging和L...

嗯哼9925
2017/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

75、GridFS

GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用Mongo DB存储数据,使用FGridFS可以快速集成开发。 工作原理: 在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个...

lianbang_W
32分钟前
4
0
js bind 绑定this指向

本文转载于:专业的前端网站➱js bind 绑定this指向 1、示例代码 <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" /> <title>bind函数绑定this指向......

前端老手
35分钟前
4
0
CentOS Linux 7上将ISO映像文件写成可启动U盘

如今,电脑基本上都支持U盘启动,所以,可以将ISO文件写到U盘上,用来启动并安装操作系统。 我想将一个CentOS Linux 7的ISO映像文件写到U盘上,在CentOS Linux 7操作系统上,执行如下命令: ...

大别阿郎
42分钟前
4
0
深入vue-公司分享ppt

组件注册 全局注册 注册组件,传入一个扩展过的构造器 Vue.component('my-component', Vue.extend({/*...*/})) 注册组件,传入一个选项对象(自动调用Vue.extend) Vue.component('my-comp...

莫西摩西
43分钟前
3
0
gitlab重置管理员密码

登录gitlab服务器 [root@localhost bin]# sudo gitlab-rails console productionLoading production environment (Rails 5.2.3)irb(main):001:0> u = User.where(email: 'admin@example.co......

King华仔o0
53分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部