Commons Logging 架构分析

#0 系列目录#apache

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,或者其余的适配器实现类以及根据项目实际须要实现的自定义适配器类。.net

  • (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“从缓存中获取日志适配器实现类实例,若是没有就新生成一个并放入缓存
相关文章
相关标签/搜索