Commons Logging 源码解析1

Commons Logging 源码解析一

  最近一段日子可真是够忙的,项目上线终于开始有回报了!一直要维护项目的一些不合理问题以及客户的新需求,越发的觉得日志是如此的重要。而且又有在看Commons的其它开源项目的源码,所以决定今天开始研究一下Commons Logging。以前一直没整理明白Logging与Log4j的区别,看了一些关于Commons Logging的官网说明以及一些同行们的总结,这才有所领悟。

  先说点理论些的东西,就说说这使用日志的重要性吧

  不知道各位有没有听过这样一句话:好程序不是写出来的,而是靠调试出来的!这句话的对错那也是仁者见仁、智者见智,不过这足以证明调试程序的重要性,而调试信息从何而来?!基本上诸如抛出异常、捕获异常或者还在用System.out.println打印?!程序调试完了,为了避免诸如System.out.println这类的垃圾代码,你除了删除再也没有别的办法!如果你不怕把大把的时间浪费在做这类无趣的事情上,你大可以不必使用日志框架。不过,等读完了这篇博文再决定要不要换个日志方式来调试程序吧!

  再来说说Commons Logging与其它日志组件的关系吧:

  从J2SE1.4开始,JDK就已经提供了Java日志 API。此外其它的日志组件还有我所知道的Log4j,LogKit等等。看我举的这些Logging 组件上为何不提Commons Logging API呢?!这是有原因的,Commons Logging到底扮演着怎么样的一个角色呢?!由来是这样的,现在有这么多的日志组件,多就意味着选择多,选择多就意味着我们要学的就多,学的多就意味着我们要了解不到组件框架的API就多!我到底要选择哪一种,各个组件之间又相互独立,如何做到各个日志的统一简化我们的开发难度,用不到的日志组件,那项目的移植性就麻烦了,Commons Logging就是Apache提供为兼顾各个不同Logging组件简化API差异而建立的一个抽象层组件。你只需要牺牲一点点的配置时间,从而达到同一项目使用不同日志组件的目的,真的没有比这个更好的了,可移植性强了,耶!

  Commons Logging组件的办法是将记录日志的功能封装为一组标准的API,使其底层实现可以任意修改和变换(就是那些org.apache.commons.logging.impl.*Logger)。开发者利用这个API来执行记 录日志信息的命令,由API来决定把这些命令传递给适当的底层实现。因此,对于开发者来说,Logging组件对于任何具体的底层实现都是平等的。

  Commons Logging如何做到对各个日志组件起到一个中间桥梁作用的呢,这就需要我们去解读他的源码了,不过需要说明的是,代码相当的少了!在读代码之前呢,我们需要对其有一个感性的认识,具体的Commons Logging使用方式大家可以通过如下链接去进行感性认识:Commons Logging的使用方法 ,我就不再重复了(大家可不要偷懒噢,一定要读完它,源码见附件,呵呵呵~)

   最后列出所有Commons Logging源代码结构:

   org.apache.commons.logging

         |__Log:一个抽象日志API的简单接口

                   |__org.apache.commons.logging.impl

                            |__AvalonLogger:包装avalon framework日志API的接口实现

                            |__Jdk13LumberjackLogger:JDK3日志实现

                            |__Jdk14Logger:包装JDK4日志API的接口实现类

                            |__Log4JLogger:Log4j日志API包装类

                            |__LogKitLogger:Avalon LogKit日志API包装实现类

                            |__NoOpLog:无日志信息输出实现类(Commons logging自带实现)

                            |__SimpleLog:commons logging自带日志实现类

         |__LogFactory:创建Log实现的工厂类

                  |__org.apache.commons.logging.impl

                            |__LogFactoryImpl

         |__LogConfigurationException

         |__LogSource

   org.apache.commons.logging.impl 

          |__ServletContextCleaner

          |__WeakHashtable