1.簡(jiǎn)介 程序開(kāi)發(fā)環(huán)境中的日志記錄是由嵌入在程序中以輸出一些對(duì)開(kāi)發(fā)人員有用信息的語(yǔ)句所組成。例如,跟蹤語(yǔ)句(trace),結(jié)構(gòu)轉(zhuǎn)儲(chǔ)和常見(jiàn)的 System.out.println或printf調(diào)試語(yǔ)句。log4j提供分級(jí)方法在程序中嵌入日志記錄語(yǔ)句。日志信息具有多種輸出格式和多個(gè)輸出級(jí)別。
使用一個(gè)專(zhuān)門(mén)的日志記錄包,可以減輕對(duì)成千上萬(wàn)的System.out.println語(yǔ)句的維護(hù)成本,因?yàn)槿罩居涗浛梢酝ㄟ^(guò)配置腳本在運(yùn)行時(shí)得以控制。 log4j維護(hù)嵌入在程序代碼中的日志記錄語(yǔ)句。通過(guò)規(guī)范日志記錄的處理過(guò)程,一些人認(rèn)為應(yīng)該鼓勵(lì)更多的使用日志記錄并且獲得更高程度的效率。
2.安裝 為了使用我們即將要安裝的日志記錄工具,還必須要設(shè)置操作環(huán)境,只有這樣,工具才能知道從哪里找到它所需要的信息,并且操作系統(tǒng)知道從哪里找到這個(gè)工具。那么,怎樣做呢?實(shí)際上,它要求更改操作環(huán)境。
從 http://jakarta./log4j/docs/download.html下載log4j發(fā)行版。
解壓存檔文件到合適的目錄中。
添加文件 dist/lib/log4j-1.2.6.jar 到 CLASSPATH 環(huán)境變量中。
3.log4j的基本概念 使用log4j大概涉及3個(gè)主要概念:
公共類(lèi) Logger
Logger 負(fù)責(zé)處理日志記錄的大部分操作。
公共接口 Appender
Appender 負(fù)責(zé)控制日志記錄操作的輸出。
公共抽象類(lèi)Layout
Layout 負(fù)責(zé)格式化Appender的輸出。 Log4j的類(lèi)圖
3.1.Logger 日志記錄器(Logger)是日志處理的核心組件。log4j具有5種正常級(jí)別(Level)。 日志記錄器(Logger)的可用級(jí)別Level (不包括自定義級(jí)別 Level), 以下內(nèi)容就是摘自log4j API (http://jakarta./log4j/docs/api/index.html):
static Level DEBUG
DEBUG Level指出細(xì)粒度信息事件對(duì)調(diào)試應(yīng)用程序是非常有幫助的。
static Level INFO
INFO level表明 消息在粗粒度級(jí)別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過(guò)程。
static Level WARN
WARN level表明會(huì)出現(xiàn)潛在錯(cuò)誤的情形。
static Level ERROR
ERROR level指出雖然發(fā)生錯(cuò)誤事件,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。
static Level FATAL
FATAL level指出每個(gè)嚴(yán)重的錯(cuò)誤事件將會(huì)導(dǎo)致應(yīng)用程序的退出。
另外,還有兩個(gè)可用的特別的日志記錄級(jí)別: (以下描述來(lái)自log4j API http://jakarta./log4j/docs/api/index.html):
static Level ALL
ALL Level是最低等級(jí)的,用于打開(kāi)所有日志記錄。
static Level OFF
OFF Level是最高等級(jí)的,用于關(guān)閉所有日志記錄。
日志記錄器(Logger)的行為是分等級(jí)的。
日志記錄器(Logger)將只輸出那些級(jí)別高于或等于它的級(jí)別的信息。如果沒(méi)有設(shè)置日志記錄器(Logger)的級(jí)別,那么它將會(huì)繼承最近的祖先的級(jí)別。因此,如果在包com.foo.bar中創(chuàng)建一個(gè)日志記錄器(Logger)并且沒(méi)有設(shè)置級(jí)別,那它將會(huì)繼承在包com.foo中創(chuàng)建的日志記錄器(Logger)的級(jí)別。如果在com.foo中沒(méi)有創(chuàng)建日志記錄器(Logger)的話,那么在com.foo.bar中創(chuàng)建的日志記錄器(Logger)將繼承root 日志記錄器(Logger)的級(jí)別,root日志記錄器(Logger)經(jīng)常被實(shí)例化而可用,它的級(jí)別為DEBUG。
有很多方法可以創(chuàng)建一個(gè)日志記錄器(Logger),下面方法可以取回root日志記錄器:
Logger logger = Logger.getRootLogger();
還可以這樣創(chuàng)建一個(gè)新的日志記錄器:
Logger logger = Logger.getLogger("MyLogger");
比較常用的用法,就是根據(jù)類(lèi)名實(shí)例化一個(gè)靜態(tài)的全局日志記錄器:
static Logger logger = Logger.getLogger(test.class);
所有這些創(chuàng)建的叫"logger"的日志記錄器都可以用下面方法設(shè)置級(jí)別:
logger.setLevel((Level)Level.WARN);
可以使用7個(gè)級(jí)別中的任何一個(gè); Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.ALL and Level.OFF.
3.2.Appender Appender 控制日志怎樣輸出。下面列出一些可用的Appender(log4j API中所描述的 http://jakarta./log4j/docs/api/index.html):
ConsoleAppender:使用用戶指定的布局(layout) 輸出日志事件到System.out或者 System.err。默認(rèn)的目標(biāo)是System.out。
DailyRollingFileAppender 擴(kuò)展FileAppender,因此多個(gè)日志文件可以以一個(gè)用戶選定的頻率進(jìn)行循環(huán)日志記錄。
FileAppender 把日志事件寫(xiě)入一個(gè)文件
RollingFileAppender 擴(kuò)展FileAppender備份容量達(dá)到一定大小的日志文件。
WriterAppender根據(jù)用戶的選擇把日志事件寫(xiě)入到Writer或者OutputStream。
SMTPAppender 當(dāng)特定的日志事件發(fā)生時(shí),一般是指發(fā)生錯(cuò)誤或者重大錯(cuò)誤時(shí),發(fā)送一封郵件。
SocketAppender 給遠(yuǎn)程日志服務(wù)器(通常是網(wǎng)絡(luò)套接字節(jié)點(diǎn))發(fā)送日志事件(LoggingEvent)對(duì)象。
SocketHubAppender 給遠(yuǎn)程日志服務(wù)器群組(通常是網(wǎng)絡(luò)套接字節(jié)點(diǎn))發(fā)送日志事件(LoggingEvent)對(duì)象。
SyslogAppender給遠(yuǎn)程異步日志記錄的后臺(tái)精靈程序(daemon)發(fā)送消息。
TelnetAppender 一個(gè)專(zhuān)用于向只讀網(wǎng)絡(luò)套接字發(fā)送消息的log4j appender。
還可以實(shí)現(xiàn) Appender 接口,創(chuàng)建以自己的方式進(jìn)行日志輸出的Appender。
3.2.1.使用ConsoleAppender ConsoleAppender可以用這種方式創(chuàng)建:
ConsoleAppender appender = new ConsoleAppender(new PatternLayout());
創(chuàng)建了一個(gè)控制臺(tái)appender,具有一個(gè)默認(rèn)的PatternLayout。它使用了默認(rèn)的System.out 輸出。
3.2.2.使用FileAppender FileAppender可以用這種方式創(chuàng)建:
FileAppender appender = null; try { appender = new FileAppender(new PatternLayout(),"filename"); } catch(Exception e) {}
上面用到的構(gòu)造函數(shù):
FileAppender(Layout layout, String filename) 實(shí)例化一個(gè)FileAppender并且打開(kāi)變量"filename"指定的文件。
另一個(gè)有用的構(gòu)造函數(shù)是:
FileAppender(Layout layout, String filename, boolean append) 實(shí)例化一個(gè)FileAppender并且打開(kāi)變量"filename"指定的文件。
這個(gè)構(gòu)造函數(shù)還可以選擇是否對(duì)指定的文件進(jìn)行追加的方式輸出。如果沒(méi)有指定值,那么默認(rèn)的方式就是追加。
3.2.3.使用WriterAppender WriterAppender可以用這種方式創(chuàng)建:
WriterAppender appender = null; try { appender = new WriterAppender(new PatternLayout(),new FileOutputStream("filename")); } catch(Exception e) {}
這個(gè)WriterAppender使用的構(gòu)造函數(shù)帶有PatternLayout和OutputStream參數(shù),在這種情況下, FileOutputStream用于向一個(gè)文件輸出。當(dāng)然,它還具有其他可用的構(gòu)造函數(shù)。
3.3.Layout Appender必須使用一個(gè)與之相關(guān)聯(lián)的 Layout,這樣它才能知道怎樣格式化它的輸出。當(dāng)前,log4j具有三種類(lèi)型的Layout:
HTMLLayout 格式化日志輸出為HTML表格。
PatternLayout 根據(jù)指定的 轉(zhuǎn)換模式格式化日志輸出,或者如果沒(méi)有指定任何轉(zhuǎn)換模式,就使用默認(rèn)的轉(zhuǎn)換模式。
SimpleLayout 以一種非常簡(jiǎn)單的方式格式化日志輸出,它打印級(jí)別 Level,然后跟著一個(gè)破折號(hào)“-“ ,最后才是日志消息。
3.4.基本示例 3.4.1.SimpleLayout和 FileAppender 這里是一個(gè)非常簡(jiǎn)單的例子,程序?qū)崿F(xiàn)了SimpleLayout和FileAppender:
import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.SimpleLayout; import org.apache.log4j.FileAppender; public class simpandfile { static Logger logger = Logger.getLogger(simpandfile.class); public static void main(String args[]) { SimpleLayout layout = new SimpleLayout(); FileAppender appender = null; try { appender = new FileAppender(layout,"output1.txt",false); } catch(Exception e) {} logger.addAppender(appender); logger.setLevel((Level) Level.DEBUG); logger.debug("Here is some DEBUG"); logger.info("Here is some INFO"); logger.warn("Here is some WARN"); logger.error("Here is some ERROR"); logger.fatal("Here is some FATAL"); } }
你可以下載: simpandfile.java。 還可以查看它的輸出: output1.txt.
3.4.2.HTMLLayout和 WriterAppender 這里是一個(gè)非常簡(jiǎn)單的例子,程序?qū)崿F(xiàn)了 HTMLLayout和WriterAppender:
import java.io.*; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.HTMLLayout; import org.apache.log4j.WriterAppender; public class htmlandwrite { static Logger logger = Logger.getLogger(htmlandwrite.class); public static void main(String args[]) { HTMLLayout layout = new HTMLLayout(); WriterAppender appender = null; try { FileOutputStream output = new FileOutputStream("output2.html"); appender = new WriterAppender(layout,output); } catch(Exception e) {} logger.addAppender(appender); logger.setLevel((Level) Level.DEBUG); logger.debug("Here is some DEBUG"); logger.info("Here is some INFO"); logger.warn("Here is some WARN"); logger.error("Here is some ERROR"); logger.fatal("Here is some FATAL"); } }
你可以下載: simpandfile.java. 還可以查看它的輸出:output1.txt.
3.4.3.PatternLayout和 ConsoleAppender 這里是一個(gè)非常簡(jiǎn)單的例子,程序?qū)崿F(xiàn)了PatternLayout和ConsoleAppender:
import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.ConsoleAppender; public class consandpatt { static Logger logger = Logger.getLogger(consandpatt.class); public static void main(String args[]) { // Note, %n is newline String pattern = "Milliseconds since program start: %r %n"; pattern += "Classname of caller: %C %n"; pattern += "Date in ISO8601 format: %d{ISO8601} %n"; pattern += "Location of log event: %l %n"; pattern += "Message: %m %n %n"; PatternLayout layout = new PatternLayout(pattern); ConsoleAppender appender = new ConsoleAppender(layout); logger.addAppender(appender); logger.setLevel((Level) Level.DEBUG); logger.debug("Here is some DEBUG"); logger.info("Here is some INFO"); logger.warn("Here is some WARN"); logger.error("Here is some ERROR"); logger.fatal("Here is some FATAL"); } }
你可以下載:simpandfile.java. 還可以查看它的輸出: output2.txt.
4.使用外部配置文件 Log4j經(jīng)常與外部日志文件聯(lián)合使用,這樣很多可選項(xiàng)不必硬編碼在軟件中。使用外部配置文件的優(yōu)點(diǎn)就是修改可選項(xiàng)不需要重新編譯程序。唯一的缺點(diǎn)就是,由于用到io 指令,速度稍微有些減慢。
有兩個(gè)方法可以用來(lái)指定外部配置文件:文本文件或者XML文件。既然現(xiàn)在所有事情都寫(xiě)成XML文件,那么該教程就重點(diǎn)講解XML文件方法,但是也包含相關(guān)文本文件的例子。首先,看看下面的XML配置文件示例:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta./log4j/"> <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.SimpleLayout"/> </appender> <root> <priority value ="debug" /> <appender-ref ref="ConsoleAppender"/> </root> </log4j:configuration>
文件以標(biāo)準(zhǔn)的XML聲明作為開(kāi)始,后面跟著指出DTD(文檔類(lèi)型定義)的DOCTYPE聲明,它定義了XML文件的結(jié)構(gòu),例如,什么元素可以嵌入在其他元素中等等。上面文件在log4j發(fā)行版的src/java/org/apache/log4j/xml目錄中。 接著看看封裝所有元素的 log4j:configuration 元素,它在DOCTYPE聲明中被指定為根元素。嵌入在根元素中有兩個(gè)結(jié)構(gòu):
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.SimpleLayout"/> </appender>
這里創(chuàng)建一個(gè)名叫"ConsoleAppender"的 Appender,注意,你可以選擇任何名字,該示例之所以選擇"ConsoleAppender",完全是為了示例的設(shè)計(jì)。接著這個(gè)appender類(lèi)以全名形式給出,經(jīng)常用規(guī)范(fully qualified)類(lèi)名。 Appender必須具有一個(gè)指定的 name和class。嵌入在 Appender之內(nèi)的是 layout元素,這里它被指定為SimpleLayout。 Layout 必須具有一個(gè) class屬性。
<root> <priority value ="debug" /> <appender-ref ref="ConsoleAppender"/> </root>
root元素必須存在且不能被子類(lèi)化。示例中的優(yōu)先級(jí)被設(shè)置為"debug",設(shè)置appender飽含一個(gè)appender-ref元素。還有更多的屬性或元素可以指定。查看log4j發(fā)行版中的src/java/org/apache/log4j/xml/log4j.dtd以了解關(guān)于XML配置文件結(jié)構(gòu)的更多信息??梢杂孟旅孢@種方法把配置信息文件讀入到Java程序中:
DOMConfigurator.configure("configurationfile.xml");
DOMConfigurator 用一棵DOM樹(shù)來(lái)初始化log4j環(huán)境。這里是示例中的XML配置文件:plainlog4jconfig.xml。這里是執(zhí)行該配置文件的程序: files/externalxmltest.java:
import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; public class externalxmltest { static Logger logger = Logger.getLogger(filetest.class); public static void main(String args[]) { DOMConfigurator.configure("xmllog4jconfig.xml"); logger.debug("Here is some DEBUG"); logger.info("Here is some INFO"); logger.warn("Here is some WARN"); logger.error("Here is some ERROR"); logger.fatal("Here is some FATAL"); } }
這里是一個(gè)實(shí)現(xiàn)帶有PatternLayout的FileAppender的日志記錄器Logger的XML配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta./log4j/"> <appender name="appender" class="org.apache.log4j.FileAppender"> <param name="File" value="Indentify-Log.txt"/> <param name="Append" value="false"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %p - %m%n"/> </layout> </appender> <root> <priority value ="debug"/> <appender-ref ref="appender"/> </root> </log4j:configuration>
你可以從這里下載示例: xmllog4jconfig2.xml。 想要得到更多的使用XML文件配置log4j環(huán)境的例子,請(qǐng)查看log4j發(fā)行版的目錄src/java/org/apache/log4j/xml/examples/ 。
這就是上面討論的文本文件形式的配置文件:
# initialise root logger with level DEBUG and call it BLAHlog4j.rootLogger=DEBUG, BLAH# add a ConsoleAppender to the logger BLAHlog4j.appender.BLAH= org.apache.log4j.ConsoleAppender# set set that layout to be SimpleLayoutlog4j.appender.BLAH.layout= org.apache.log4j.SimpleLayout
從這里可以下載: plainlog4jconfig.txt。這就是執(zhí)行該配置文件的程序:
import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class externalplaintest { static Logger logger = Logger.getLogger(externalplaintest.class); public static void main(String args[]) { PropertyConfigurator.configure("plainlog4jconfig.xml"); logger.debug("Here is some DEBUG"); logger.info("Here is some INFO"); logger.warn("Here is some WARN"); logger.error("Here is some ERROR"); logger.fatal("Here is some FATAL"); } }
你可以下載使用該配置文件的示例: externalplaintest.java。想要獲得更多的使用文本文件配置log4j環(huán)境的例子,請(qǐng)查看log4j發(fā)行版中的目錄examples。
使用外部配置文件的例子就簡(jiǎn)單的討論到這里,現(xiàn)在應(yīng)該可以肯定你已經(jīng)有能力獨(dú)立學(xué)習(xí)更多的log4j發(fā)行版和測(cè)試版中提供的例子。
5.參考資料 (以及一些有參考價(jià)值的鏈接) http://jakarta./log4j/docs/manual.html
log4j的簡(jiǎn)明介紹 - Ceki G- 2002年3月
http://www./htdocs/log4jhelp.html
不要用System.out.println!用Log4j - Vipan Singla
給你的Java應(yīng)用程序添加日志記錄 - Kevin Brown
Logger對(duì)象是用來(lái)取代System.out或者System.err的日志寫(xiě)出器,用來(lái)供程序員輸出日志信息。 Logger類(lèi)對(duì)象提供一系列方法供程序員輸出日志信息:
Logger由一個(gè)String類(lèi)的名字識(shí)別,logger的名字是大小寫(xiě)敏感的,且名字之間具有繼承的關(guān)系,子名有父名作為前綴,用點(diǎn)號(hào).分隔。如:x.y是x.y.z的父親。 根logger (root logger)是所有logger的祖先,它具有如下屬性:1) 它總是存在的;2) 它不可以通過(guò)名字獲得。 通過(guò)調(diào)用public static Logger Logger.getRootLogger()獲得root logger;通過(guò)調(diào)用public static Logger Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)獲得(或者創(chuàng)建)一個(gè)named logger。后者相當(dāng)于調(diào)用Logger.getLogger(clazz.getName())。 在某對(duì)象中,用該對(duì)象所屬的類(lèi)為參數(shù),調(diào)用Logger.getLogger(Class clazz)以獲得logger被認(rèn)為是目前所知的最理智的命名logger的方法。 每個(gè)logger都被分配了一個(gè)日志級(jí)別 (log level),用來(lái)控制日志信息的輸出。未被分配level的logger將繼承它最近的父logger的level。 每條輸出到logger的日志請(qǐng)求(logging request)也都有一個(gè)level,如果該request的level大于等于該logger的level,則該request將被處理(稱為enabled);否則該request將被忽略。故可得知:
Level類(lèi)中預(yù)定義了五個(gè)level,它們的大小關(guān)系如下: Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF
以下代碼將用自己所屬的類(lèi)為參數(shù),創(chuàng)建一個(gè)logger,啟用默認(rèn)配置,設(shè)置其level并向其輸出若干logging request。 import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
public class Log4jTest {
public static void main(String argv[]) {
// Create a logger by the name of class Log4jTest.
Logger logger = Logger.getLogger(Log4jTest.class);
// Use the default configuration.
BasicConfigurator.configure();
// Set the logger level to Level.INFO
logger.setLevel(Level.INFO);
// This request will be disabled since Level.DEBUG < Level.INFO.
logger.debug("This is debug.");
// These requests will be enabled.
logger.info("This is an info.");
logger.warn("This is a warning.");
logger.error("This is an error.");
logger.fatal("This is a fatal error.");
return;
}
}
每個(gè)logger都可以擁有一個(gè)或者多個(gè)appender,每個(gè)appender表示一個(gè)日志的輸出目的地,比如console或者某個(gè)文件。可以使用Logger.addAppender(Appender app)為logger增加一個(gè)appender;可以使用Logger.removeAppender(Appender app)為logger移除一個(gè)appender。 默認(rèn)情況下,logger的additive標(biāo)志被設(shè)置為true,表示子logger將繼承父logger的所有appenders。該選項(xiàng)可以被重新設(shè)置,表示子logger將不再繼承父logger的appenders。 root logger擁有目標(biāo)為system.out的consoleAppender,故默認(rèn)情況下,所有的logger都將繼承該appender。 // Log4j APIs : class Logger
// 為logger對(duì)象增加或者移除一個(gè)Appender對(duì)象 public void appAppender(Appender app);
public void removeAppender(Appender app);
// 獲得和設(shè)置additive標(biāo)志:是否繼承父logger的appenders // 注意:在設(shè)置additive標(biāo)志為false時(shí),必須保證已經(jīng)為該logger設(shè)置了新的appender, // 否則log4j將報(bào)錯(cuò):log4j:WARN No appenders could be found for logger (x.y.z). public boolean getAdditivity();
public void setAdditivity(boolean additive);
可以使用ConsoleAppender對(duì)象把日志輸出到控制臺(tái)。每個(gè)ConsoleAppender都有一個(gè)target,表示它的輸出目的地。它可以是System.out,標(biāo)準(zhǔn)輸出設(shè)備(緩沖顯示屏);或者是System.err,標(biāo)準(zhǔn)錯(cuò)誤設(shè)備(不緩沖顯示屏)。ConsoleAppender的使用方法參考如下API: // Log4j APIs : class ConsoleAppender extends WriterAppender
// 構(gòu)造方法,使用一個(gè)Layout對(duì)象構(gòu)造一個(gè)ConsoleAppender對(duì)象 // 默認(rèn)情況下,ConsoleAppender的target是System.out public ConsoleAppender(Layout layout);
// 構(gòu)造方法,使用一個(gè)Layout對(duì)象和一個(gè)target字符串構(gòu)造ConsoleAppender對(duì)象 // target的可能取值為ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR public ConsoleAppender(Layout layout, String target);
可以使用FileAppender對(duì)象把日志輸出到一個(gè)指定的日志文件中去。使用方法可以參考如下的API: // Log4j APIs : class FileAppender extends WriterAppender
// 構(gòu)造方法,使用一個(gè)Layout對(duì)象和日志文件名構(gòu)造一個(gè)FileAppender對(duì)象 public FileAppender(Layout layout, String filename)
throws IOException;
public FileAppender(Layout layout, String filename, boolean append)
throws IOException;
可以使用FileAppender的子類(lèi)RollingFileAppender對(duì)象,把日志輸出到一個(gè)指定的日志文件中。不同的是該日志文件的大小受到限制,當(dāng)日志內(nèi)容超出最大的尺寸時(shí),該文件將向上滾動(dòng)(最老的日志被擦除)。還可以在該類(lèi)對(duì)象中指定為日志文件做多少個(gè)備份。具體使用方法參考如下API: // Log4j APIs : class RollingFileAppender extends FileAppender
// 構(gòu)造方法,使用一個(gè)Layout對(duì)象和日志文件名構(gòu)造一個(gè)RollingFileAppender對(duì)象 public RollingFileAppender(Layout layout, String filename)
throws IOException;
public RollingFileAppender(Layout layout, String filename, boolean append)
throws IOException;
// 獲得和設(shè)置日志備份文件的個(gè)數(shù) public int getMaxBackupIndex();
public void setMaxBackupIndex(int index);
// 獲得和設(shè)置滾動(dòng)日志文件的最大尺寸 public long getMaximumFileSize();
public void setMaximumFileSize(long size);
每個(gè)appender都和一個(gè)layout相聯(lián)系;layout的任務(wù)是格式化用戶的logging request,appender的任務(wù)是把layout格式化好的輸出內(nèi)容送往指定的目的地。 PatternLayout是Layout的一個(gè)子類(lèi),用來(lái)使用類(lèi)似C語(yǔ)言的printf函數(shù)中使用的格式控制字符串來(lái)控制日志的輸出格式。使用方法參考如下API: // Log4j APIs : class PatternLayout extends Layout
// 無(wú)參數(shù)構(gòu)造方法,使用DEFAULT_CONVERSION_PATTERN構(gòu)造一個(gè)PatternLayout // 注意:DEFAULT_CONVERSION_PATTERN為"%m%n",只打印消息信息 public PatternLayout();
// 構(gòu)造方法,使用自定義的pattern構(gòu)造一個(gè)PatternLayout public PatternLayout(String pattern);
// 獲得和設(shè)置PatternLayout對(duì)象的日志pattern public String getConversionPattern();
public void setConversionPattern(String pattern);
Fixme (heavyz) To be added... 對(duì)log4j環(huán)境的配置就是對(duì)root logger的配置,包括把root logger設(shè)置為哪個(gè)級(jí)別(level);為它增加哪些appender,等等。這些可以通過(guò)設(shè)置系統(tǒng)屬性的方法來(lái)隱式地完成,也可以在程序里調(diào)用XXXConfigurator.configure()方法來(lái)顯式地完成。 Logger類(lèi)的靜態(tài)初始化塊(static initialization block)中對(duì)log4j的環(huán)境做默認(rèn)的初始化。注意:如果程序員已經(jīng)通過(guò)設(shè)置系統(tǒng)屬性的方法來(lái)配置了log4j環(huán)境,則不需要再顯式地調(diào)用XXXConfigurator.configure()方法來(lái)配置log4j環(huán)境了。 Logger的靜態(tài)初始化塊在完成初始化過(guò)程時(shí)將檢查一系列log4j定義的系統(tǒng)屬性。它所做的事情如下:
BasicConfigurator.configure()方法使用最簡(jiǎn)的方法配置log4j環(huán)境。注:所謂配置log4j環(huán)境,就是指配置root logger,因?yàn)樗衅渌?/span>logger都是root logger的后代,所以它們(默認(rèn)情況下)都將繼承root logger的性質(zhì)。 BasicConfigurator.configure()完成的任務(wù)是:
xml格式的log4j配置文件需要使用org.apache.log4j.xml.DOMConfigurator.configure()方法來(lái)讀入。對(duì)xml文件的語(yǔ)法定義可以在log4j的發(fā)布包中找到:org/apache/log4j/xml/log4j.dtd。 log4j的xml配置文件的樹(shù)狀結(jié)構(gòu)如下所示,注意下圖只顯示了常用的部分。 xml declaration and DTD
|
log4j:configuration
|
+-- appender (name, class)
| |
| +-- param (name, value)
| +-- layout (class)
| |
| +-- param (name, value)
+-- logger (name, additivity)
| |
| +-- level (class, value)
| | |
| | +-- param (name, value)
| +-- appender-ref (ref)
+-- root
|
+-- param (name, class)
+-- level
| |
| +-- param (name, value)
+-- appender-ref (ref)
xml配置文件的頭部包括兩個(gè)部分:xml聲明和DTD聲明。頭部的格式如下: <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
appender元素定義一個(gè)日志輸出目的地。
layout元素定義與某一個(gè)appender相聯(lián)系的日志格式化器。
logger元素定義一個(gè)日志輸出器。
root元素定義根日志輸出器root logger。
level元素定義logger對(duì)象的日志級(jí)別。
appender-ref元素引用一個(gè)appender元素的名字,為logger對(duì)象增加一個(gè)appender。
param元素在創(chuàng)建對(duì)象時(shí)為類(lèi)的構(gòu)造方法提供參數(shù)。它可以成為appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。
創(chuàng)建不同的Appender對(duì)象或者不同的Layout對(duì)象要調(diào)用不同的構(gòu)造方法??梢允褂?/span>param子元素來(lái)設(shè)定不同的參數(shù)值。 ConsoleAppender的構(gòu)造方法不接受其它的參數(shù)。 ... ... ... ...
<appender name="console.log" class="org.apache.log4j.ConsoleAppender">
<layout ... >
... ...
</layout>
</appender>
... ... ... ...
可以為FileAppender類(lèi)的構(gòu)造方法傳遞兩個(gè)參數(shù):File表示日志文件名;Append表示如文件已存在,是否把日志追加到文件尾部,可能取值為"true"和"false"(默認(rèn))。 ... ... ... ...
<appender name="file.log" class="org.apache.log4j.FileAppender">
<param name="File" value="/tmp/log.txt" />
<param name="Append" value="false" />
<layout ... >
... ...
</layout>
</appender>
... ... ... ...
除了File和Append以外,還可以為RollingFileAppender類(lèi)的構(gòu)造方法傳遞兩個(gè)參數(shù):MaxBackupIndex備份日志文件的個(gè)數(shù)(默認(rèn)是1個(gè));MaxFileSize表示日志文件允許的最大字節(jié)數(shù)(默認(rèn)是10M)。 ... ... ... ...
<appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/tmp/rollingLog.txt" />
<param name="Append" value="false" />
<param name="MaxBackupIndex" value="2" />
<param name="MaxFileSize" value="1024" />
<layout ... >
... ...
</layout>
</appender>
... ... ... ...
可以為PatternLayout類(lèi)的構(gòu)造方法傳遞參數(shù)ConversionPattern。 ... ... ... ...
<layout class="org.apache.log4j.PatternLayout>
<param name="Conversion" value="%d [%t] %p - %m%n" />
</layout>
... ... ... ...
為WSOTA(Web Services Over The Air)項(xiàng)目開(kāi)發(fā)java web start的胖客戶端時(shí),使用了如下的xml文件配置log4j環(huán)境(文件名為wsota-rc.log4j.xml): <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta./log4j/">
<!-- ================================================================= -->
<!-- a rolling file appender -->
<!-- ================================================================= -->
<appender name="wsota-rc.file.log" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/tmp/wsota-rc.log" />
<param name="Append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %p - %m%n" />
</layout>
</appender>
<!-- ================================================================= -->
<!-- a console appender -->
<!-- debug can be turned off by setting level of root to "off" -->
<!-- ================================================================= -->
<appender name="wsota-rc.console.log" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %p - %m%n" />
</layout>
</appender>
<!-- use this to turn on debug to a rolling file. -->
<root>
<level value="debug" />
<appender-ref ref="wsota-rc.file.log" />
</root>
<!-- use this to turn on debug to console. -->
<!--
<root>
<level value="off" />
<appender-ref ref="wsota-rc.console.log" />
</root>
-->
<!-- use this to turn off debug. -->
<!--
<root>
<level value="off" />
<appender-ref ref="wsota-rc.console.log" />
</root>
-->
</log4j:configuration>
在胖客戶程序中使用了如下代碼來(lái)使用外部xml文件配置log4j環(huán)境,注意該代碼段位于程序的main class的靜態(tài)初始化塊中,含有以下代碼的類(lèi)和xml配置文件在同一個(gè)目錄下: import org.apache.log4j.xml.DOMConfigurator;
public class SapFrame extends JFrame {
static {
DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.xml"));
}
... ... ... ...
}
Fixme (heavyz) To add more...
最近在搞一個(gè)項(xiàng)目架設(shè),希望從構(gòu)建一個(gè)項(xiàng)目方方面面都徹底研究透,增長(zhǎng)實(shí)戰(zhàn)經(jīng)驗(yàn)。 廢話少說(shuō),先看看一個(gè)史上最簡(jiǎn)單的log例子,看看我是如何用最簡(jiǎn)潔的設(shè)計(jì)實(shí)現(xiàn)將異常 項(xiàng)目文件結(jié)構(gòu)
view plaincopy to clipboardprint? /** }
view plaincopy to clipboardprint? 運(yùn)行吧,出錯(cuò)了,恭喜你成功了,去TestLog目錄下尋找my.log日志信息吧
記錄日志就是這么簡(jiǎn)單,不過(guò)你可以有其他的需要: 我要將日志發(fā)到郵箱 這些都可以通過(guò)修改配置log4j.properties配置文件來(lái)實(shí)現(xiàn)
2.配置appender 類(lèi)型有以下幾種 3.配置日志信息格式Layout 4.自定義的布局中用到的格式化日志信息
|
|
來(lái)自: 168一路發(fā) > 《java》