apache commons-logging

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的SimpleLog
    org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger;//选择使用log4j
    org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger; //选择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"); //致命错误

将commons-logging和Log4j的jar包都放置到classpath下,同时也将Log4j的配置文件放到classpath中,两者就可以很好的合作,实现如下:

package com.doctorcom.model;   
  import org.apache.commons.logging.Log;       
  public class LogFactorySupport {          
      public Log getLog(){   
          Log log = org.apache.commons.logging.LogFactory.getLog(LogFactorySupport.class);   
          log.info("");   
          log.debug("");   
        }       
    } 

Log4j配置内容主要是依据配置文件log4j.properties:

#指定根Logger,及日志输出级别
#大于等于该级别的日志将被输出( DEBUG < INFO < WARN < ERROR < FATAL ),设为OFF可以关闭日志   
log4j.rootLogger=DEBUG, A1,A2   
#指定log输出目的,这里设为输出日志到指定目录的文件my.log中   
log4j.appender.A1=org.apache.log4j.FileAppender   
log4j.appender.A1.File=\\logs\\my.log   #当前根目录下
#指定日志信息的格式   
log4j.appender.A1.layout=org.apache.log4j.PatternLayout    
log4j.appender.A1.layout.ConversionPattern=%r %d{yyyy-MM-dd HH:mm:ss} %c %p -%m%n   
#把A2输出到控制台   
log4j.appender.A2=org.apache.log4j.ConsoleAppender   
log4j.appender.A2.layout=org.apache.log4j.SimpleLayout    
#还可以单独指定输出某个包的日志级别   
#log4j.logger.com.study.HelloLog4j=INFO

slf4j
slf4j全称是:simple logging facade for java,可以理解为简单日记门面。准确的说,slf4j并不是一种具体的日志系统,而是一个用户日志系统的facade,它允许用户在部署最终应用时方便的变更其日志系统。
slf4j最吸引我的地方是:占位符(place holder)的使用。占位符在代码中表示为“{}”的特性。占位符是一个非常类似于在String的format()方法中的%s,因为它会在运行时被某个提供的实际字符串所替换。这不仅降低了代码中字符串连接次数,而且还节省了新建的String对象。

下面是在Log4j中使用的方案,但这样做降低了代码可读性因为增加了不必要的繁琐重复代码:

if (logger.isDebugEnabled()) 
{
    logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}

但是如果你使用slf4j的话,你可以得到在极简洁的格式的结果,就像以下展示的一样:

logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);

你可能感兴趣的:(apache commons-logging)