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(套接字服务器), JMS(JAVA 消息服务), NT Event Loggers(NT 事件记录器), 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信息。
log4j的PatternLayout可以让程序以类似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 |
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,FATAL(0),ERROR(3),WARN(4),INFO(6),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(包含日志产生的时间、线程、类别等信息)