zoukankan      html  css  js  c++  java
  • commons-logging日志系统

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

    • 最原始的日志方式,就是在程序的适当地方添加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");
    }

  • 相关阅读:
    auto_ptr智能指针
    友元函数
    设计模式之单件模式
    vs2008工程部署不成功,可能是远程文件路径出现问题
    printf(“%06d ”,x);
    16进制到文本字符串的转换,在线实时转换
    文件包含
    pwn-200
    misc-3-1
    misc-适合作为桌面
  • 原文地址:https://www.cnblogs.com/hoobey/p/6079057.html
Copyright © 2011-2022 走看看