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);