- 日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息
是寸步难行的。所以在系统加入日志是必须的。
- 最原始的日志方式,就是在程序的适当地方添加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){
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的配置。