文档章节

Commons Logging 架构分析

陶邦仁
 陶邦仁
发布于 2015/10/22 10:24
字数 1090
阅读 835
收藏 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“从缓存中获取日志适配器实现类实例,如果没有就新生成一个并放入缓存

© 著作权归作者所有

陶邦仁
粉丝 1683
博文 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
668
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.5K
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

没有更多内容

加载失败,请刷新页面

加载更多

Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
55分钟前
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部