Log4j使用浅析

来源:互联网 发布:两个区域写入一个数组 编辑:程序博客网 时间:2024/06/06 07:52

 

前些天方兴同学让我看看log4j,本来觉得也是个蛮好玩儿的东西,一直要看的,所以借朋友的东风我就琢磨了一下了。现在将看后的一些东西写出来,权当是笔记了。

测试程序Test.java

package test;

 

import org.apache.log4j.*;

public class Test {

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       PropertyConfigurator.configure("test.properties");

       Logger logger = Logger.getLogger("myLogger");

       logger.debug("Hello, log");

        logger.info("Hello again...");     

    }

}

配置文件test.properties

##配置logger组件##

#配置logger的超类rootlogger

log4j.rootLogger=INFO,file

 

#定义logger组件

log4j.logger.myLogger=debug,console

 

##appender##

 

#在控制台输出结果

log4j.appender.console=org.apache.log4j.ConsoleAppender

 

#配置日志输出目的地

log4j.appender.file=org.apache.log4j.FileAppender

log4j.appender.file.File=log.html

 

##layout##

 

#配置控制台上的显示形式

log4j.appender.console.layout=org.apache.log4j.SimpleLayout

 

#配置在文件中的显示开式

log4j.appender.file.layout=org.apache.log4j.HTMLLayout

对于这样一个程序,我们可以看到第一句

PropertyConfigurator.configure("test.properties");

PropertyConfigurator类通过configure方法初始化loggerManager类,这样属性文件中配置的logger现在可以成为一个个的实体,能够被调用。这里的实现使用的是工厂方法,这种方法在spring以及其它的开源框架中都有使用到。这个时候我们可以同调用loggerManagergetlogger(String name)的方法得到一个特定配置的logger对象。当然也可以使用程序中使用的方法Logger.getLogger("myLogger");我们知道myLogger已经在属性文件中配置了,因此现在只是从刚才的Manager那里得到该对象而已,这样就避免了logger对象的重复构建。在LoggerManager的背后还有一个LoggerRepository类,它才是储存这些logger对象的地方,这一点大家可以在log4j的源代码中自己摸索到。

下面我们来看看属性文件

log4j.rootLogger=INFO,file

这样配置了程序的根logger。如果我们不显示的申明调用哪个logger,程序将使用这个默认的logger。它有两个参数INFO,FileINFO是我们需要记录的日志级别,在log4j中有OFFFATALERRORWARNINFODEBUGALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是FATAL ERRORWARNINFODEBUG。当我们选择了INFO以后INFO和其上的所有级别的日志信息将被记录下来。即ErrorWARNINFO将被记录下来。记录它的对象是FileFile对象是记录日志的载体。

#配置日志输出目的地

log4j.appender.file=org.apache.log4j.FileAppender

log4j.appender.file.File=log.html

#配置在文件中的显示开式

log4j.appender.file.layout=org.apache.log4j.HTMLLayout

这样我们就可以知道根logger将使用FileAppender,即日志将被写入文件中,在这里是写入log.html文件中。同时文件的显示方式为HTMLLayout方式。

Log4j中提供的appender有:

org.apache.log4j.ConsoleAppender(控制台);

org.apache.log4j.FileAppender(文件);

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件);

org.apache.log4j.RollingFileAppender(文件大小到指定尺寸产生一个新的文件);

org.apache.log4j.WriteAppender(将日志信息以流格式发送到任意指定地方);

 

最后我们来看看这句

Logger logger = Logger.getLogger("myLogger");

当我们调用这句话时程序做了些什么??它将使用LoggerManagerLoggerRepository中寻找是否有一个名称为myLoggerlogger,如果有,则将它的引用返回;否则以根logger为模板创建一个新的logger对象。

在我们这个程序中已经实例化了一个myLogger对象,大家知道在什么地方吗?

#定义logger组件

log4j.logger.myLogger=debug,console

对了,就是这句话,我们定义了一个新的logger以备不时之需,它的日志记录级别设置为debug,它将日志全部输出到终端。剩下的与配置根logger一样。在此不再冗述。

总之,log4j作为一种日志记录组件,它有着很好的配置管理功能,大家不妨在自己的项目中使用一下。