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(包含日志產生的時間、線程、類別等信息)