commons-logging和log4j
在项目中,我们经常会看到两个 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相关推荐
- 【日志问题】JDK Logging、Commons Logging和Log4j、Slf4j和Logbacck的介绍和简单使用
[日志问题]JDK Logging.Commons Logging和Log4j.Slf4j和Logbacck的介绍和简单使用 是什么 简介 如何使用 JDK logging log4j +slf4j ...
- Java日志输出Logger,Commons Logging,Log4j的运用
日志 在编写程序的过程中,常常用System.out.println()打印出执行过程中的某些变量,观察每一步的结果与代码逻辑是否符合,然后有针对性地修改代码.改好之后又要删除打印语句,这样很麻烦. ...
- Jakarta Commons Logging(JCL)开发手记
JCL(Jakarta Commons Logging)和log4j不都是做log的吗,怎么在jcl的源码包中,还有个log4j的包?倒底怎么回事?看了jcl的用户指南,就明白了. 1.Common ...
- 【log4j】—日志记录log4j的Logger和commons.logging的Log的区别
1.做日志的时候一般是两者一起用,commons-logging工作原理做接口,log4j做实现,应用起来比单独的使用log4j要简单. commons-logging工作原理: 1.1 首先在cla ...
- java common log使用,log4j和commons.logging日志记录的使用方法
# re: log4j和commons.logging日志记录的使用方法 2008-03-11 14:08 芦苇 一 最好与commons-logging一起用,why? 1.标准接口,即使将来脱离了 ...
- common.logging和log4j比较
apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现 log4j是具体的日 ...
- Jakarta Commons Logging学习笔记
1.Commons-Loggin简介 Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具. 它提 ...
- 使用Commons Logging - Java异常处理
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;/*** Commons Log ...
- 深入源码之Commons Logging[转]
包括Commons Logging.SLF4J.JDK Logging.LogBack.首先从Commons Logging和SLF4J的比较开始. 先来随便扯点吧,貌似所有这些流行的Logging框 ...
- 日志门面技术(3):JCL(Jakarta Commons Logging)
目录 背景 ▎ JCL的诞生 JCL 是什么? ▎快速入门案例 JCL原理 ✈ 源码断点查看执行流程 JCL日志门面总结 ☁ 每日一题:为什么要学习日志门面JCL? 日志框架出现的历史顺序:Log4j ...
最新文章
- CSP认证201604-3	路径解析[C++题解]:字符串处理、模拟、vector切分字符串
- canva画图 图片居中裁剪_Canvas裁剪图片(截选框可拖拽)
- mysql 嵌入式 c开发环境_【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)
- weather at Cambridge will be fine next week
- VTK:图片之Flip
- Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers
- centos7搜狐 mysql_基于centOS6.7搭建LAMP(httpd-2.4.18+mysql-5.5.47+php-5.6.16)环境
- python3 sleep 并发_python异步编程之asyncio(百万并发)
- s5pv210——AD转换
- micropython教程nucleo-f767zi开发板_教你做CMSIS-DAP仿真器(基于Nucleo-F767ZI)
- python线程安全_线程,线程安全与python的GIL锁
- 1078. Bigram 分词
- 用SqlConnectionStringBuilder修改连接超时时间
- matlab中firrcos,DMR数字集群关键技术的应用研究
- ThinkPHP 3.1.2 模板中的变量
- mPaaS小程序创建
- 设置电脑的保护色(绿豆沙色)
- 电脑双系统完美卸载Ubuntu
- NowCoder错题
- 使用 zsh 后HOME/END 键以及小键盘失效