日期:2014-05-16  浏览次数:20761 次

Apache通用日志工具commons-logging和Log4j 使用总结(转载) .
前言

在程序开发中,有时候为了跟踪代码的运行情况,需要在程序代码中加入一些打印代码运行情况的日志代码,在早期的C语言中,一般都是用printf()函数来实现这些信息的输出,在Java语言中用 System..out.println()来实现控制台信息输出。这种输出的信息功能非常有限,如果要输出到文件,就很麻烦。并且,如果以后想去掉(不再输出)这些信息,还需要手动的一行一行去改。 当然,也有一种解决办法可以实现处理这个问题,在Java中,可以这么写:

------------------------------------------------------
package org.lavasoft.test1;

/**
* File Name:   LogUtil.java
* Created by:  IntelliJ IDEA.
* Copyright:   Copyright (c) 2003-2006
* Company:     LavaSoft( http://lavasoft.blog.51cto.com )
* Author:      leizhimin
* Modifier:    leizhimin
* Date Time:   2007-5-7 16:38:19
* Readme:      手动日志工具类
*/
public class LogUtil {
    private static boolean logSwitch=true;  //日志开关,默认为开
    public static void log(String smg){
        if(logSwitch){
            System.out.println(smg);
        }
    }
} ------------------------------------------------------
package org.lavasoft.test1;

/**
* File Name:   ManualLogApp.java
* Created by:  IntelliJ IDEA.
* Copyright:   Copyright (c) 2003-2006
* Company:     LavaSoft( http://lavasoft.blog.51cto.com )
* Author:      leizhimin
* Modifier:    leizhimin
* Date Time:   2007-5-7 16:38:02
* Readme:      手动日志工具测试
*/
public class ManualLogApp {
    public static void main(String[] args){
        new ManualLogApp().test();
    }

    public void test(){
        LogUtil.log("我在手动打日志,呵呵!");
    }
}

通过这两个类,就实现一个简单的日志工具。当你不想打印日志的时候,可以在LogUtil中改 logSwitch的值为flase,那么日志打印功能就关闭了。如果你愿意,你可以将这个开关放到一个配置文件中去修改。还可以让日志打印到文件,但是当你修改实现这个功能的时候,这个日志工具会变得相当的复杂。

为了解决上面的问题,Apache针对不同的语言平台为做了一系列日志工具包,可应用于java、.net、 php、c++,这些日志包都是免费的,使用非常方便,可以极大提高编程效率。并且,Apache为了让众多的日志工具有一个相同操作方式,还实现做了一个通用日志工具包commons-logging 。

commons-logging是为那些需要建立在不同环境下使用不同日志架构的组件或库的开发者创建的,其中包括Apache Log4j以及Java log的日志架构。把日志信息commons-logging的Log接口,并由commons-logging在运行时决定使用哪种日志架构。
现在,以我见,Apache通用日志工具commons-logging和Log4j已经成为Java日志的标准工具。

下面我Log4j(对Java平台的)和通用日志工具包commons-logging的应用做一个总结。

一、 Log4j的架构

Log4j系统的三大板块:日志写入器、日志输出终端、日志布局模式。


Logger类是日志包的核心,Logger的名称是大小写敏感的,并且名称之间有继承关系。子名由父名做前缀,用点号“.”分隔,如x.y是x.y.z的父亲Logger。

Logger系统中有个根logger,是所有logger的祖先,它总是存在的,并且不可以通过名字获取,可以通过Logger.getRootLogger()来获取。

获取Logger对象的方法很多,可以参考API文档:
static Logger getLogger(Class clazz)
          Shorthand for getLogger(clazz.getName()).
static Logger getLogger(String name)
          Retrieve a logger named according to the value of the name parameter.
static Logger getLogger(String name, LoggerFactory factory)
          Like getLogger(String) except that the type of logger instantiated depends on the type returned by the LoggerFactory.makeNewLoggerInstance(java.lang.String) method of the factory parameter.
static Logger getRootLogger()
          Return the root logger for the current logger repository.

在某对象中,用该对象所属的类作