Apache Jakarta Log4J(学习笔记)

注:这些笔记来源于恨的网上资料,如与您的文章相冲突,望请见谅.
一〉
log4j的组件:记录器、存放器和布局

下面分别讲述这几种组件:

1〉记录器:log4j允许程序员定义多个记录器,每个记录器有自己的名字,记录器之间通过名字来表示隶属关系(或家族关系)。例如记录器a.b与记录器a.b.c是父子关系,而记录器a与记录器a.b.c是祖先与后代的关系,父子关系是祖先与后代关系的特例,通过这种关系来记录不同记录器之间的逻辑关系。

有一个记录器叫做根记录器,他永远存在并且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法取得它,而一般的记录器通过Logger.getLogger(String name)方法取得它。

下面是记录器(Logger)的基本方法:

public org.apache.log4j;

public class Logger{

     //用于检索的方法

     public static Logger getRootLogger();

     public static Logger getLogger(String name);

     //根据级别记录日志的方法

   public void debug(Object message);

   public void info(Object message);

   public void fatal(Object message);

   public void error(Object message);

   public void warn(Object message);

   //一般的记录日志的方法

   public void log(Level level,Object message);

}

记录器的级别:程序员可以给不同的记录器赋予不同的级别,如果某个记录器没有被明确的赋予记录器级别,就自动继承最近的一个有级别的长辈的级别值,根记录器总有级别值。

如:

记录器名

赋予的级别值

继承的级别值

root

Proot

Proot

X

Px

Px

X.Y

None

Px

X.Y.Z

None

Px

程序员可以自由定义级别,级别间存在偏序关系

如果一条log信息的级别大于等于记录器的级别,那么记录器就会记录它。

Logger logger=Logger.getLogger(“com.log”);

Logger.setLevel(Level.INFO);//设定记录器的级别

logger.warn(“log info”);//能够加入到日志中去,因为warn>=info

logger.debug(“log debug”);//不能加入到日志中去,以为debug<info

Logger otherLog=Logger.getLogger(“com.log.bar”);

otherLog.info(“message”);//可以被加入到日志中去,因为otherLog继承

logger的日志级别为info,info>=info,因此可以被记录进日志中。

OtherLog.debug(“other message”);//info<debug,一次不能被加入到日志中去

特殊情况:

一〉当一个记录器被实例化后,再次用相同的名字调用getLogger()时会返回对它的引用,这非常有利于用同一个记录器在不同的代码或类中记录 log信息。

二〉一个记录器的祖先可以比后代记录器出现的晚,但会自动根据名字之间的关系建立家族关系。

   2〉存放器:log4j中,log信息通过存放器输出到目的地。

支持的存放器有:console(控制台), files(文件), GUI components(GUI 组件), remote socket servers(套接字服务器), JMSJAVA 消息服务), NT Event LoggersNT 事件记录器), remote UNIX Syslog daemons(UNIX Syslog守护进程)Log信息可被异步存放。

一个记录器可以有多个存放器,可以通过addAppender来增加存放器。一条blog信息如果可被这个记录器处理,则记录器会把这条信息送往每个它所拥有的存放器。

每个记录器有一个继承开关,其开关决定记录器是/否继承其父记录器的存放器,注意,如果继承则只继承其父记录器,而不考虑更远的祖先的情况。

记录器

增加的存放器

继承的存放器

输出的目的地

备注

root

A1

不使用

A1

没有默认继承

X

A-x1,A-x2

True

A1, A-x1,A-x2

默认继承root

x.y

None

True

A1, A-x1,A-x2

默认继承root

x.y.z

A-xyz1

True

A1, A-x1,A-x2, A-xyz1

 

security

A-sec

False

A-sec

 

security.access

none

true

A-sec

 

3>布局:负责格式化输出的log信息。

log4jPatternLayout可以让程序以类似C语言printf的格式化模板来定义格式。

log4j可据程序员制定的标准自动提供一些log信息,这对那类需要频繁log的对象的情况很帮助。对象的自动log具有继承性。

二〉Log4J的环境配置

Log4J的配置文件(Configuration File)是用来设置记录器级别、存放器和布局的,它可以接受key=value格式的设置获XML格式的设置信息,通过配置可以建立起log4j的运行环境。

并且Log4J运行时不对环境做任何假定,尤其是没有默认的存放器。

环境配置方法:

一〉在程序中调用BasicConfigurator.configure()方法。

二〉配置内容放在文件中,通过命令行参数传递文件名字,使用PropertyConfigurator.configure(args[x];解析并配置。

三〉配置内容放在文件中,通过环境变量传递文件名等信息,利用Log4J默认的初始化过程解析并配置。

四〉配置内容放在文件中,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。

对于第一种配置方法,如:

import com.foo.Bar;

import org.apache.log4j.Logger;

import org.apache.log4j.BasicConfigurator;

public class MyApp {

static Logger logger = Logger.getLogger(MyApp.class);

public static void main(String[] args) {

BasicConfigurator.configure();

logger.info("Entering application.");

Bar bar = new Bar();

bar.doIt();

logger.info("Exiting application.");

}

}

package com.foo;

import org.apache.log4j.Logger;

public class Bar {

static Logger logger = Logger.getLogger(Bar.class);

public void doIt() {

logger.debug("Did it again!");

}

}

 

 

 

Root category

priority

appederList

Priority. DEBUG

FileAppender Object

Prints on the console,using

A PatternLayout

Category object

Name=”com.foo.bar”

Parent

Priority

appenderList

Category object

Name=”com.foo.bar”

Parent                       

Priority                         

appenderList

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


                                          null

                                                                             null

配置文件内容祥解:

一〉log4j.rootLogger=[level],appenderName,appenderName,…………

例:log4j.rootLogger=INFO,A1,R

level是日志记录的优先级,分为OFF,FATAL0,ERROR3,WARN4,INFO6,ALL,DEBUG(7)或者是您定义的级别。Log4j建议只使用四种级别,优先级从高到底分别为error,warn,info,debug,可以制定多个输出目的地。

二〉log4j.appender.appenderName=fully.qualified.name.of.appender.class

例:log4j.appender.A1=org.appender.log4j.ConsoleAppender

log4j.appender.appenderName.option=value1

…………………………………

log4j.appender.appenderName.option=valueN

其中log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台

org.apache.log4j.FileAppender(文件)

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

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

org.apache.log4j.WriterAppender(将日志信息以流的形式发送到任意指定的地方)

三〉

log4j.appender.appenderName.layout=fully.qualified.name.of.class

例:

#时间:

log4j.appender.A1.layout. ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p]%m%n

#R 输出到文件RollingFillAppender的扩展,可以提供一种日志的备份的功能

log4j.appender.R=org.apache.log4j.RollingFileAppender

#日志的名称

log4j.appender.R.File=log4j.log

#日志文件的大小

log4j.appender.R.MaxFileSize=100kb

#保存一个日志文件

log4j.appender.R.MaxBackupIndex=1

 

log4j.appender.appenderName.layout.aption1=value1

 

log4j.appender.appenderName.layout.aptionN=valueN

其中,log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(HTML表格形式布局)

org.apache.log4j.PatternLayout(可以灵活的制定布局模式)

org.apache.log4j.SimpleLayout(包含日志信息的级别和消息字符串)

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)