日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息    是寸步难行的。所以在系统加入日志是必须的。

  • 最原始的日志方式,就是在程序的适当地方添加System.out.println()方法,但是带来    的问题是,系统稳定后,日志太大,如果要减少日志量,就需要重新修改程序,虽然只    是注释掉System.out.println()方法。但是万一系统再次出错,又要改。
  • commons-logging提供分级日志功能,相当于把System.out.println()方法加强了,原来    是一定输出到控制台,现在commons-logging有6级日志,但是apache建议使用4级,即    ERROR、WARN、INFO、DEBUG。什么情况下输出日志由程序中写日志的方法决定,输出什    么级别以上的日志和输出到哪里由配置文件决定。
  • 使用commons-logging如下:
//导入类
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestLog
{
//获取以当前类为参数的日志对象
private static Log log = LogFactory.getLog(TestLog.class);
public static void main(String[] args){
//输出4种不同级别的日志
log.debug("111");
log.info("222");
log.warn("333");
log.error("444");
}
}
  • 当然还要配置commons-logging.properties文件,其中定义输出哪个级别以上的日志。
  • 好像这就完了,和log4j没啥关系。那么为什么一般系统都会使用commons-logging和    log4j两个包来记录日志呢?
  • 原因就是commons-logging的输出功能比较弱,也就是输出格式和输出设备选择有限,只    有原生输出类org.apache.commons.logging.impl.SimpleLog。但是它提供了一个通用的    日志接口org.apache.commons.logging.log,让其他的包来实现复杂的输出。其中就有    Jdk14Logger, Log4JLogger,前面是jdk1.4之后加入的,后面就是log4j中的类。
  • log4j也可以直接像commons-logging一样在程序中定义输出信息,然后再配置文件中定    义输出级别,但是这样做就会使程序唯一的和log4j绑定(如果你一定要单独使用    log4j,那么也是可以的),而且commons-logging更加智能,帮我们自动选择"适当的"    日志实现系统:
1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则
使用其中定义的Log实现类; 2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量
org.apache.commons.logging.Log,找到则使用其定义的Log实现类; 3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类; 4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类); 5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;
  • 所以,在前面程序的基础上,只要导入log4j的包,则commons-logging会自动使用    log4j作为输出类,程序不需要任何改动,但是注意:log4j的配置文件    log4j.properties对Log4j来说是必须的。如果classpath中没有该配置文件,或者配置    不对,将会引发运行时异常。所以下面介绍log4j.properties的配置。

使用commons-logging和log4j记录日志

commons-logging下载
commons-logging是Apache下的开源项目。commons-logging.jar的下载地址为:http://commons.apache.org/proper/commons-logging/download_logging.cgicommons-logging。commons-logging的目的是为“所有的Java日志实现”提供一个统一的接口,使项目与日志实现工具解耦。

为什么要使用commons-logging+log4j?
commons-logging和log4j都是Apache下的开源项目。commons-logging的目的是为“所有的Java日志实现”提供一个统一的接口,使项目与日志实现工具解耦,它自身的日志功能比较弱(只有一个简单的 SimpleLog),所以一般不会单独使用它。Log4j的功能非常强大,是目前最主流的java日志工具。结合使用两者可以避免使项目与log4j紧密耦合,用户可以轻松切换到其他日志工具,同时又可以使用log4j的强大功能。

commons-logging如何自动选择适当的日志实现工具?
我们在使用commons-logging+日志实现工具时,我们的代码只需要和commons-logging打交道,由commons-logging去选择适当的日志实现工具。这里我们看一下commons-logging是如何去选择实现工具的:
-首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
上面这个配置,commons-logging会使用commons-logging的SimpleLog
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
这个配置,commons-logging就会选择使用log4j
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
这个配置,commons-logging会选择jdk的logger
-如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类
-否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类。
-否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类)。
-否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog。
可见,commons-logging总是能找到一个日志实现类,并且尽可能找到一个最合适的日志实现类。
为了简化配置,我们可以不使用commons-logging的配置文件,也不设置commons-logging相关的环境变量,只需将log4j的包放入classpath就可以了,这样就可以完成commons-logging与log4j的结合。如果以后不想使用log4j,只需将log4j的包 从classpath中移除就可以了。

如何在代码中输出日志?
-导入所需commons-logging的类
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类变量
private static Log log = LogFactory.getLog(ClassName.class);
-使用静态类变量输出日志信息
为了方便的控制日志输出,把日志分成了不同的级别,从低到高分别是调试,信息,警告,错误,致命错误。这样我们可以通过log4j的配置决定只输出某个级别以上的日志。例如,在开发时我们将debug(调试)及以上的日志全部输出,而在项目正常运行时,设置为只输出warn(警告)及以上的日志。
//输出调试级别的日志信息
log.debug("debug");
//输出信息级别的日志信息
log.info("information");
//输出警告级别的日志信息
log.warn("warning");
//输出错误级别的日志信息
log.error("error");
//输出致命错误级别的日志信息

log.fatal("fatal");
正因为我们可以通过配置文件来设置日志输出的级别,所以写代码时我们并不知道某条日志是不是会真正输出,比如
log.debug("debug");
在设置了日志输出级别为info(信息)或以上的情况下,是不会被真正输出的。这种情况下,为了节省资源,我们可以在输出一条日志前加一个判断语句,判断该日志确实会被输出的情况下才去执行输出代码,如下所示
//输出调试级别的日志信息
if(log.isDebugEnabled()){
log.debug("debug");
}
//输出信息级别的日志信息
if(log.isInfoEnabled()){
log.info("information");
}
//输出警告级别的日志信息
if(log.isWarnEnabled()){
log.warn("warning");
}
//输出错误级别的日志信息
if(log.isErrorEnabled()){
log.error("error");
}
//输出致命错误级别的日志信息
if(log.isFatalEnabled()){
log.fatal("fatal");
}

commons-logging日志系统的更多相关文章

  1. Python logging日志系统

    写我小小的日志系统 配置logging有以下几种方式: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件, ...

  2. Python logging(日志)模块

    python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...

  3. pyhton——logging日志模块的学习

    https://www.cnblogs.com/yyds/p/6901864.html 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模 ...

  4. 函数式编程(logging日志管理模块)

    本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日 ...

  5. 廖雪峰Java3异常处理-2断言和日志-3使用Commons Logging

    Commons Logging是Apache创建的日志模块: 可以挂接不同的日志系统 可以通过配置文件指定挂接的日志系统 自动搜索并使用Log4j 如果Log4j不存在,使用JDK Logging(J ...

  6. Spring 使用 SLF4J代替 Commons Logging 写日志 异常

    项目的日志更换成slf4j和logback后,发现项目无法启动.错误提示 Caused by: java.lang.NoClassDefFoundError: Lorg/apache/commons/ ...

  7. java日志框架与日志系统

    日志框架:提供日志调用的接口,实际的日志输出委托给日志系统实现. JCL(Jakarta Commons Logging):比较流行的日志框架,很多框架都依赖JCL,例如Spring等. SLF4j: ...

  8. 配置Tomcat的日志系统

    成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格 ...

  9. 实战3--项目开始--准备:::资源分类, 日志系统, 写BaseDao

     项目资源分类: 1.   package: base, dao, dao.impl, domain, service, service.impl, util, view.action 2.   co ...

随机推荐

  1. HDU 4715:Difference Between Primes

    Difference Between Primes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  2. Winform知识

    文档界面 分类: 1.单文档界面应用程序(SDI) 特点: 1.应用程序中SDI的所有窗体都彼此独立 2.多文档界面应用程序(MDI) 特点: 1.每个应用程序中只能有一个MDI父窗体,在父窗体中可以 ...

  3. Animator角色重复受击播放问题

    需要指定开始时间参数,否则Animator会默认当前已经在播放这个动画而忽略掉 CrossFade一样 gif: public class AnimatorDebug : MonoBehaviour ...

  4. HTML+CSS编写规范

    在任何一个项目或者系统开发之前都需要定制一个开发约定和规则,这样有利于项目的整体风格统一.代码维护和扩展.由于Web项目开发的分散性.独立性.整合的交互性等,所以定制一套完整的约定和规则显得尤为重要. ...

  5. Python3基础 print 输出hello world

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  6. SSL/TLS 原理详解

    本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...

  7. js数组去重的三种常用方法总结

    第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中   Array.p ...

  8. github 修改fork的代码之后如何提交代码并pull request

    官方的解释还是有点模糊,我是参照这篇文章来的. http://www.linuxidc.com/Linux/2012-12/76922.htm 关于Git的版本管理的原理,我是从这篇文章里面学习的. ...

  9. 青岛理工大学第五届ACM交流赛 部分题解

    A:后缀维护si*pi的最小值,查询的时候二分,判断后缀和当前两个部分就行. #include <bits/stdc++.h> using namespace std; typedef l ...

  10. SAP传输系统TMS、开发类、传输请求

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...