在项目中,我们经常会看到两个 jar 包:commons-logging.jar 和 log4j.rar。
    为什么我们在使用 log4j 的同时还要引入 commons-logging.jar 呢,或者说不用 commons-logging.jar 可不可以,这两者之间到底是怎么的一种关系呢?

我们都知道,真正的记录日志的工具是 log4j 和 sun 公司提供的日志工具。
    而 commons-logging 把这两个记录日志的工具重新封装了一遍(Log4JLogger.java 和 Jdk14Logger.java),可以认为 org.apache.commons.logging.Log 是个傀儡,它只是提供了对外的统一接口。(实际上,在 org.apache.commons.logging.impl 包下,commons-logging 仅仅为我们封装了 log4j 和 sun logger)。
    因此我们只要能拿到 org.apache.commons.logging.Log,而不用关注到底使用的是 log4j 还是 sun logger。正如我们经常在项目中这样写:
        // MyClass 是我们自己写的类,LogFactory 是一个专为提供 Log 的工厂(abstract class)  
    private static final Log logger = LogFactory.getLog(MyClass.class);
    
  而使用log4j记录日志时,使用如下三个方法获取logger:
    Logger.getRootLogger();
    Logger getLogger(Class clazz);
    Logger getLogger(String name);
    
   既然如此,我们向构建路径加了 commons-logging.jar 和 log4j.jar 两个 jar 包,那我们的应用程序到底使用的 log4j 还是 sun logger 呢?我们能不能认为由于加了 log4j.jar 包,就认为系统使用的就是 log4j 呢?事实上当然不是这样的,那我还认为我正在使用 jdk 而认为系统使用的是 sun logger 呢。使用 Spring 的朋友可以在 web.xml 中看到如下 listener 片段:
        <listener>  
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
        </listener>

这是由 Spring 为我们提供的实现了标准的 servlet api 中的 javax.servlet.ServletContextListener 接口,用于在 web 容器启动时做一些初始化操作。
    从Spring 的源码,可以看到如下代码:Log4jConfigurer.initLogging(location, refreshInterval);  
    找到 org.springframework.util.Log4jConfigurer,这正是 log4j 提供给我们的初始化日志的类。至此,我们终于明白了我们系统的的确确使用的是 log4j 的日志工具。

可是问题又来了,org.apache.commons.logging.Log 和 org.apache.log4j.Logger 这两个类,通过包名我们可以发现它们都是 apache 的项目,既然如下,为何要动如此大的动作搞两个东西(指的是 commons-logging 和 log4j)出来呢?事实上,在 sun 开发 logger 前,apache 项目已经开发了功能强大的 log4j 日志工具,并向 sun 推荐将其纳入到 jdk 的一部分,可是 sun 拒绝了 apache 的提议,sun 后来自己开发了一套记录日志的工具。可是现在的开源项目都使用的是 log4j,log4j 已经成了事实上的标准,但由于又有一部分开发者在使用 sun logger,因此 apache 才推出 commons-logging,使得我们不必关注我们正在使用何种日志工具。
  
   
   下面我说明如何通过配置文件来组合commons-logging和log4j。
        配置文件内容很简单,就指定一个日志实现类即可,下面是个示例文件:
        
        commons-logging.properties
        --------------------------------------------------------------------------------
        org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
        --------------------------------------------------------------------------------

在使用Log4j作为日志工具的时候,commons-logging.properties的配置可以不要,在下面例子中,你可以尝试删除此文件,而不影响日志输出。

转载于:https://blog.51cto.com/zlfwmm/1610374

commons-logging和log4j相关推荐

  1. 【日志问题】JDK Logging、Commons Logging和Log4j、Slf4j和Logbacck的介绍和简单使用

    [日志问题]JDK Logging.Commons Logging和Log4j.Slf4j和Logbacck的介绍和简单使用 是什么 简介 如何使用 JDK logging log4j +slf4j ...

  2. Java日志输出Logger,Commons Logging,Log4j的运用

    日志 在编写程序的过程中,常常用System.out.println()打印出执行过程中的某些变量,观察每一步的结果与代码逻辑是否符合,然后有针对性地修改代码.改好之后又要删除打印语句,这样很麻烦. ...

  3. Jakarta Commons Logging(JCL)开发手记

    JCL(Jakarta Commons Logging)和log4j不都是做log的吗,怎么在jcl的源码包中,还有个log4j的包?倒底怎么回事?看了jcl的用户指南,就明白了.  1.Common ...

  4. 【log4j】—日志记录log4j的Logger和commons.logging的Log的区别

    1.做日志的时候一般是两者一起用,commons-logging工作原理做接口,log4j做实现,应用起来比单独的使用log4j要简单. commons-logging工作原理: 1.1 首先在cla ...

  5. java common log使用,log4j和commons.logging日志记录的使用方法

    # re: log4j和commons.logging日志记录的使用方法 2008-03-11 14:08 芦苇 一 最好与commons-logging一起用,why? 1.标准接口,即使将来脱离了 ...

  6. common.logging和log4j比较

    apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现 log4j是具体的日 ...

  7. Jakarta Commons Logging学习笔记

    1.Commons-Loggin简介 Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具. 它提 ...

  8. 使用Commons Logging - Java异常处理

    import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;/*** Commons Log ...

  9. 深入源码之Commons Logging[转]

    包括Commons Logging.SLF4J.JDK Logging.LogBack.首先从Commons Logging和SLF4J的比较开始. 先来随便扯点吧,貌似所有这些流行的Logging框 ...

  10. 日志门面技术(3):JCL(Jakarta Commons Logging)

    目录 背景 ▎ JCL的诞生 JCL 是什么? ▎快速入门案例 JCL原理 ✈ 源码断点查看执行流程 JCL日志门面总结 ☁ 每日一题:为什么要学习日志门面JCL? 日志框架出现的历史顺序:Log4j ...

最新文章

  1. CSP认证201604-3 路径解析[C++题解]:字符串处理、模拟、vector切分字符串
  2. canva画图 图片居中裁剪_Canvas裁剪图片(截选框可拖拽)
  3. mysql 嵌入式 c开发环境_【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)
  4. weather at Cambridge will be fine next week
  5. VTK:图片之Flip
  6. Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers
  7. centos7搜狐 mysql_基于centOS6.7搭建LAMP(httpd-2.4.18+mysql-5.5.47+php-5.6.16)环境
  8. python3 sleep 并发_python异步编程之asyncio(百万并发)
  9. s5pv210——AD转换
  10. micropython教程nucleo-f767zi开发板_教你做CMSIS-DAP仿真器(基于Nucleo-F767ZI)
  11. python线程安全_线程,线程安全与python的GIL锁
  12. 1078. Bigram 分词
  13. 用SqlConnectionStringBuilder修改连接超时时间
  14. matlab中firrcos,DMR数字集群关键技术的应用研究
  15. ThinkPHP 3.1.2 模板中的变量
  16. mPaaS小程序创建
  17. 设置电脑的保护色(绿豆沙色)
  18. 电脑双系统完美卸载Ubuntu
  19. NowCoder错题
  20. 使用 zsh 后HOME/END 键以及小键盘失效

热门文章

  1. ArcGIS Engine 项目10.1升级10.2
  2. 成功的自动化测试实施的5大支柱(译)
  3. DevExpress控件之GridControl、GridView
  4. bs4 python解析html
  5. Json对象与Json字符串互转(4种转换方式)
  6. PowerDesigner使用教程 —— 概念数据模型详解
  7. WF4B1 的有返回值的Activity,Bookmark,有返回值Bookmark
  8. linux cat 命令详解
  9. 第一个ilasm程序
  10. java日志服务器_java服务器搭建(一)日志系统