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