log4j動(dòng)態(tài)修改級(jí)別實(shí)例_第1頁(yè)
log4j動(dòng)態(tài)修改級(jí)別實(shí)例_第2頁(yè)
log4j動(dòng)態(tài)修改級(jí)別實(shí)例_第3頁(yè)
log4j動(dòng)態(tài)修改級(jí)別實(shí)例_第4頁(yè)
log4j動(dòng)態(tài)修改級(jí)別實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、動(dòng)態(tài)配置log4j的級(jí)別。對(duì)于log4j的初學(xué)者是很有用的。我是個(gè)菜鳥,隨便寫了個(gè),別介意。1.import java.io.IOException;import javax.servlet.ServletException;import javax.servlet. HYPERLINK http:/http.HttpServlet http.HttpServlet;import javax.servlet. HYPERLINK http:/http.HttpServletRequest http.HttpServletRequest;import javax.servlet. HYPERLI

2、NK http:/http.HttpServletResponse http.HttpServletResponse;import org.apache.log4j.PropertyConfigurator;public class Log4jInit extends HttpServlet public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException public void init() throws ServletExcept

3、ion String prefix = getServletContext().getRealPath(/)+WEB-INFclasses;String file = getInitParameter(log4j-init-file);if(file != null)PropertyConfigurator.configure(prefix+file);2.import org.apache.log4j.Level;import org.apache.log4j.Logger;import org.apache.log4j.Priority;import org.apache.log4j.Pr

4、opertyConfigurator;public class TestBean private static Logger logger = Logger.getLogger(TestBean.class);protected String title;public String getTitle() logger.debugC這里是 Log4j 獲得的信息+title);return title;public void setTitle(String title) /PropertyConfigurator.configure(D:MyEclipse6.0workspacecycsrcpe

5、rties);/logger.setLevel(Level.INFO);(1=里是 Log4j 獲得的信息+title);logger.debug(2=Start of the main();(3=Just testing a log message with priority set to INFO);logger.warn(4=Just testing a log message with priority set to WARN);logger.error(5=Just testing a log message with priority set to ERROR);logger.fa

6、tal(6=Just testing a log message with priority set to FATAL); logger.log(Priority.DEBUG, 7=Testing a log message use a alternate form); logger.debug(8=End of the main();this.title = title;建立 pertieslog4j.rootCategory=ERROR,stdout,Rlog4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender

7、.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=QC %p %t %C.%M(%L) | %m%nlog4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=C:SysTestLog4j.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.Con

8、versionPattern=%d-TS %p %t %c - %m%n.neusoft=DEBUG .opensymphony.oscache=ERROR .sf.navigator=ERROR mons=ERROR .apache.struts=WARN .displaytag=ERROR.springframework=DEBUG .ibatis.db=WARN .apache.velocity=FATAL.canoo.webtest=WARN.logicalcobwebs=WARN建立 index.jsp log4j AAAAAAAA 5 web.xmlLog4jInittest.Lo

9、g4jInitlog4j-init-fileperties1index.jsp這樣可以在頁(yè)面上實(shí)現(xiàn)動(dòng)態(tài)修改類的log輸出的級(jí)別。PropertyConfigurator.configureAndWatch(/WEB-INF/perties, 1000);log4j 自帶有 FileWatchdog 功能:PropertyConfigurator.configureAndWatch(c:/perties,60000);/每分鐘檢測(cè)一次文件是否被更改,如果更改,則自動(dòng)重新讀取配置。DOMConfigurator.configureAndWatch(c:/perties,60000);/xm 配置格

10、式的。動(dòng)態(tài)配置log4j1配置外部配置文件來(lái)配置的基本步驟1.1 一個(gè)運(yùn)用配置文件的實(shí)例Log4j之所以能成功的原因之一是它的靈活性。但如果只是簡(jiǎn)單的調(diào)用 BasicConfigurator.configure()來(lái)進(jìn)行配置工作,那么所有的配置都是在函數(shù)中寫死的,以后修 改配置就要修改原代碼,這就不能體現(xiàn)出log4j的靈活性了,所以基本上不會(huì)通過(guò)BasicConfigurator.configure(來(lái) 進(jìn)行配置工作的。為了增加軟件的靈活性,最常用的做法就是使用配置文件,如web.xml之于J2EE,struts-config.xml之于struts 一樣,log4j也提供了讓我們把配置信息從

11、程序轉(zhuǎn)移到配置文件 中的方法。Log4j提供了兩種方式的配置文件:XML文件和Java的property配置文件。通過(guò) 把配置信息轉(zhuǎn)移到外部文件中,當(dāng)我們要修改配置信息時(shí),就可以直接修改配置文件而不用 去修改代碼了,下面,我們就來(lái)完成一個(gè)通過(guò)配置文件來(lái)實(shí)現(xiàn)log4j的實(shí)例。例 2-a:package TestLog4j;import org.apache.log4j.Logger;import org.apache.log4j.BasicConfigurator;import org.apache.log4j.PropertyConfigurator;import org.apache.log

12、4j.Priority; public class TestLog4j static Logger logger = Logger.getLogger(TestLog4j.class.getName();public TestLog4j()public static void main(String args)通過(guò)BasicConfigurator類來(lái)初始化/BasicConfigurator.configure();/(1)通過(guò)配置文件來(lái)初始化PropertyConfigurator.configure(F:nepalonperties);logger.debug(Start of the

13、main() in TestLog4j); 代碼(2) (Just testing a log message with priority set to INFO);logger.warn(Just testing a log message with priority set to WARN);logger.error(Just testing a log message with priority set to ERROR); logger.fatal(Just testing a log message with priority set to FATAL);logger.log(Pri

14、ority.WARN, Testing a log message use a alternate form);logger.debug(TestLog4j.class.getName(); 代碼(2)在這個(gè)例子中,我們用PropertyConfigurator.configure(F:nepalonperties)代替BasicConfigurator.configure(進(jìn)行配置。PropertyConfigurator.configure (函數(shù)的參數(shù)可以是一個(gè) properties文件所在路徑的String對(duì)象,可以是一個(gè)properties文件所在路徑的URL對(duì)象, 也可以是一個(gè)pr

15、operties對(duì)象。通過(guò)PropertyConfigurator.configure()可以通過(guò)指定的 properties文件來(lái)配置信息。如果要用XML文件進(jìn)行信息配置,可以在代碼中調(diào)用DOMConfigurator()函數(shù)來(lái)進(jìn)行配置工作。在這里,我們只以properties文件來(lái)完成例子。接 著,我們來(lái)看一下perties文件中都有些什么東西:例 2-b:log4j.rootLogger = DEBUG, A1log4j.appender.A1 = org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout = org.apache.

16、log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern = %-4r %t %-5p %c %x - %m%n 運(yùn)行這個(gè)實(shí)例,運(yùn)行結(jié)果為0 main DEBUG TestLog4j.TestLog4j - Start of the main() in TestLog4j20 main INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO20 main WARN TestLog4j.TestLog4j - Just test

17、ing a log message with priority set to WARN20 main ERROR TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR20 main FATAL TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL 180 main WARN TestLog4j.TestLog4j - Testing a log message use a alternate form

18、 180 main DEBUG TestLog4j.TestLog4j - TestLog4j.TestLog4j下面,我們分析一下這個(gè)配置文件。由于每一個(gè)Logger對(duì)旬都有一個(gè)級(jí)別,文件的第一行就是定義了一個(gè)Logger及其級(jí)別。 在這里定義了一個(gè)根記錄器(root logger),這涉及到記錄器的層次問(wèn)題,在些暫時(shí)不深入討 論,在后面的章節(jié)再進(jìn)行討論。第二行定義了一個(gè)名為A1的輸出流,這個(gè)流就是控制臺(tái),所以通過(guò)Logger對(duì)象打印的 信息會(huì)在控制臺(tái)輸出。第三行定義了打印信息的布局。在這里我們用PatternLayout作為此記錄器的布局,PatternLayout允許你以靈活的格式來(lái)打印

19、信息。第四行指定的打印信息的具體格式,從結(jié)果可知,這個(gè)實(shí)例的打印格式為:當(dāng)前打印語(yǔ) 句所使用的時(shí)間日志所在的線程打印的級(jí)別當(dāng)前日志所在的類的全名日志信息。現(xiàn)在我們來(lái)修改一下這個(gè)記錄器的級(jí)別,把第一行的DEBUG改為INFO,再運(yùn)行程序,結(jié)果 將變?yōu)椋? main INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO10 main WARN TestLog4j.TestLog4j - Just testing a log message with priority set to WARN10

20、 main ERROR TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR10 main FATAL TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL10 main WARN TestLog4j.TestLog4j - Testing a log message use a alternate form由于這個(gè)Logger的級(jí)別變?yōu)镮NFO,而代碼(2)是調(diào)用debug()函數(shù)來(lái)輸出日志信息時(shí)只

21、能 當(dāng)記錄器級(jí)別為DEBUG時(shí)才輸出信息,所以代碼(2)將不輸出信息。1.2實(shí)例原理1.2.1初始化配置信息如果要通過(guò)JAVA的properties文件來(lái)配置信息,那么在代碼中就要通過(guò) PropertyConfigurator.configure(函數(shù)從properties文件中加載配置信息,這個(gè)函數(shù)有三種參數(shù) 形式:一個(gè)properties文件所在路徑的String對(duì)象,可以是一個(gè)properties文件所在路徑的 URL對(duì)象,也可以是一個(gè)properties對(duì)象。如果要用XML文件來(lái)配置信息,則可用類型的 DOMConfigurator()函數(shù)來(lái)從一個(gè)XML文件中加載配置信息。1.2.2

22、輸出端 Appender在上面的例子中,我們都是簡(jiǎn)單的把日志信息輸出到控制臺(tái)中。其實(shí)在log4j中還可以把日 志信息輸出到其它的輸出端,對(duì)于同一個(gè)日志信息,我們還可以讓它同時(shí)輸出到多個(gè)輸出端 中,如同時(shí)在控制臺(tái)和文件中進(jìn)行打印。一個(gè)輸出端就是一個(gè)appender。要在配置文件中 定義一個(gè)appender有三步:1)在定義一個(gè)記錄器的同時(shí)定義出該記錄器的輸出端appender。在例2的配置文件的第一 句log4j.rootLogger = DEBUG, A1中,我們定義了一個(gè)根記錄器,它的級(jí)別為DEBUG,它有一 個(gè) appender 名為 A1。定義根記錄器的格式為 log4j.rootLog

23、ger = level , appendName1, appendName2, appendNameN。同一個(gè)記錄器可有多個(gè)輸出端。2)定義appender的輸出目的地。定義一個(gè)appender的輸出目的地的格式為 log4j.appender.appenderName = .of.appender.clas。log4j 提供了 以下幾種 常用的輸出目的地:? org.apache.log4j.ConsoleAppender,將日志信息輸出到控制臺(tái)? org.apache.log4j.FileAppender,將日志信息輸出到一個(gè)文件? org.apache.log4j.DailyRollin

24、gFileAppender,將日志信息輸出到一個(gè),并且每天輸出到一個(gè)新 的日志文件? org.apache.log4j.RollingFileAppender,將日志信息輸出到一個(gè)文件,通過(guò)指定文件的的尺寸, 當(dāng)文件大小到達(dá)指定尺寸的時(shí)候會(huì)自動(dòng)把文件改名,如名為example.log的文件會(huì)改名為 example.log.1,同時(shí)產(chǎn)生一個(gè)新的example.log文件。如果新的文件再次達(dá)到指定尺寸,又 會(huì)自動(dòng)把文件改名為example.log.2,同時(shí)產(chǎn)生一個(gè)example.log文件。依此類推,直到 example.log. MaxBackupIndex, MaxBackupIndex 的值

25、可在配置文件中定義。? org.apache.log4j.WriterAppender,將日志信息以流格式發(fā)送到任意指定的地方。? org.apache.log4j.jdbc.JDBCAppender,通過(guò)JDBC把日志信息輸出到數(shù)據(jù)庫(kù)中。在例 2 中,log4j.appender.A1 = org.apache.log4j.ConsoleAppender定義了名為 A1 的 appender 的輸出目的地為控制臺(tái),所以日志信息將輸出到控制臺(tái)。3)定義與所選的輸出目的地相關(guān)的參數(shù),定義格式為:log4j.appender.appenderName.optionName1 = value1 lo

26、g4j.appender.appenderName.optionNameN = valueN其中一個(gè)最常用的參數(shù)layout將在下面介紹。1.2.3 輸出格式(布局)layout通過(guò)appender可以控制輸出的目的地,而如果要控制輸出的格式,就可通過(guò)log4j的layout 組件來(lái)實(shí)現(xiàn)。通過(guò)配置文件定義一個(gè)appender的輸出格式,也通常需要兩個(gè)步驟:1)定義appender的布局模式。定義一個(gè)appender的布局模式的格式為log4j.appender.appenderName.layout = .of.layout.class Log4j 提供的布局模 式有以下幾種:? org.ap

27、ache.log4j.HTMLLayout,以 HTML表格形式布局? org.apache.log4j.PatternLayout,可以靈活地指定布局模式? org.apache.log4j.SimpleLayout,包含日志信息的級(jí)別和信息字符串在例 2 中 log4j.appender.A1.layout = org.apache.log4j.PatternLayout 定義了名為 A1 的 appender 的布局模式為 PatternLayout。2)定義與所選的布局模式相關(guān)的設(shè)置信息,定義格式為:log4j.appender.appenderName.layout.optionNa

28、me1 = value1 log4j.appender.appenderName.layout.optionNameN = valueN選擇了不同的布局模式可能會(huì)有不同的設(shè)置信息。實(shí)例2所選的布局模式PatternLayout的 一個(gè)PatternLayout為ConversionPattern,通過(guò)定義這個(gè)PatternLayout的值,我們可以指定 輸出信息的輸出格式。在例2的配置文件中的定義如下 log4j.appender.A1.layout.ConversionPattern = %-4r %t %-5p %c %x - %m%n。在下面,我們將 介紹布局模式PatternLayou

29、t的參數(shù)ConversionPattern的各個(gè)值代表的含義。1.2.4 ConversionPattern 參數(shù)的格式含義格式名含義%c輸出日志信息所屬的類的全名%d輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%dyyy-MM-dd HH:mm:ss ,輸出類似:2002-10-18-22: 10: 28%f輸出日志信息所屬的類的類名%l輸出日志事件的發(fā)生位置,即輸出日志信息的語(yǔ)句處于它所在的類的第幾行%m輸出代碼中指定的信息,如log(message)中的message%n輸出一個(gè)回車換行符,Windows平臺(tái)為“rn”,Unix平臺(tái)為“n”%p輸出優(yōu)

30、先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL。如果是調(diào)用debug()輸出的,則 為DEBUG,依此類推%r輸出自應(yīng)用啟動(dòng)到輸出該日志信息所耗費(fèi)的毫秒數(shù)%t輸出產(chǎn)生該日志事件的線程名1.3定義多個(gè)輸出目的地的實(shí)例從上面的實(shí)例原理中我們已經(jīng)知道,同一個(gè)日志信息可以同時(shí)輸出到多個(gè)輸出目的地,在這 個(gè)例子中,我們將實(shí)現(xiàn)一個(gè)把日志信息同時(shí)輸出到控制器、一個(gè)文件中的實(shí)例和數(shù)據(jù)庫(kù)中。 這個(gè)實(shí)例的Java代碼我們沿用例2中的代碼,我們只需修改配置文件即可。這也體現(xiàn)了 log4j 的靈活性。例 3-a:create table log4j(logID int primary key iden

31、tity,message varchar(1024),priority varchar(10),milliseconds int,category varchar(256),thread varchar(100),NDC varchar(256),createDate datetime,location varchar(256),caller varchar(100),method varchar(100),filename varchar(100),line int)例 3-b:#1定義了兩個(gè)輸出端log4j.rootLogger = INFO, A1, A2,A3#2定義A1輸出到控制器l

32、og4j.appender.A1 = org.apache.log4j.ConsoleAppender#3定義A1的布局模式為PatternLayoutlog4j.appender.A1.layout = org.apache.log4j.PatternLayout#4定義A1的輸出格式log4j.appender.A1.layout.ConversionPattern = %-4r %t %-5p %c - %m%n#5定義A2輸出到文件log4j.appender.A2 = org.apache.log4j.RollingFileAppender#6定義A2要輸出到哪一個(gè)文件log4j.a

33、ppender.A2.File = F:nepalonclassesexample3.log#7定義A2的輸出文件的最大長(zhǎng)度log4j.appender.A2.MaxFileSize = 1KB#8定義A2的備份文件數(shù)log4j.appender.A2.MaxBackupIndex = 3#9定義A2的布局模式為PatternLayoutlog4j.appender.A2.layout = org.apache.log4j.PatternLayout#10定義A2的輸出格式log4j.appender.A2.layout.ConversionPattern = %dyyyy-MM-dd hh:

34、mm:ss:%p %t %c - %m%n#11區(qū)定義A3輸出到數(shù)據(jù)庫(kù)log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.A3.BufferSize = 40log4j.appender.A3.Driver = com.microsoft.jdbc.sqlserver.SQLServerDriverlog4j.appender.A3.URL = jdbc:microsoft:sqlserver:/:1433;DatabaseName=nepalonlog4j.appender.A3.User = salog4

35、j.appender.A3.Password =log4j.appender.A3.layout = org.apache.log4j.PatternLayoutlog4j.appender.A3.layout.ConversionPattern= INSERT INTO log4j (createDate, thread, priority, category, message) values(getdate(), %t, %-5p, %c, %m)配置文件中的6、7、8行顯示了輸出端為RollingFileAppender的特有參數(shù)及其運(yùn)用的方法。 11區(qū)顯示了輸出端為JDBCAppend

36、er的特有參數(shù)及其運(yùn)用方法。在這著重講解一下6、7、8 行的作用。6行指定日志信息輸出到哪個(gè)文件,7行指定日志文件的最大長(zhǎng)度,最后要詳細(xì) 介紹8行。第8行的參數(shù)是設(shè)置備份文件的個(gè)數(shù)的參數(shù),在這里我們?cè)O(shè)置為3,表示最多有 3個(gè)備份文件,具體作用為:當(dāng)example3.log文件的大小超過(guò)K時(shí),就把文件改名為example3.log.1,同時(shí)生成一個(gè)新 的 example3.log 文件當(dāng)example3.log文件的大小再次超過(guò)1K,又把文件改名為example3.log.1。但由于此時(shí) example3.log.1 已存在,則先把 example3.log.1 更名為 example3.log

37、.2,再把 example3.log 文 件改名為 example3.log.13)同理,當(dāng)example3.log文件的大小再次超過(guò) 1K,先把example3.log.2文件更名為 example3.log.3,把 example3.log.1 文件更名為 example3.log.2,再把 example3.log 文件改名 為 example3.log.14)當(dāng)example3.log文件的大小再次超過(guò)1K,先把example3.log.2文件更名為example3.log.3, 舊的example3.log.3文件將被覆蓋;把example3.log.1文件更名為example3.l

38、og.2,舊的 example3.log.2文件被覆蓋;最后把example3.log文件改名為example3.log.1并覆蓋掉舊的 example3.log.1 文件。運(yùn)行結(jié)果將分為兩部分在控制器中:0 main INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO11 main WARN TestLog4j.TestLog4j - Just testing a log message with priority set to WARN21 main ERROR TestLog4j.

39、TestLog4j - Just testing a log message with priority set to ERROR 21 main FATAL TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL21 main WARN TestLog4j.TestLog4j - Testing a log message use a alternate form在文件 example3.log 中:2003-12-18 04:23:02:INFO main TestLog4j.TestLog4j

40、 - Just testing a log message with priority set to INFO2003-12-18 04:23:02:WARN main TestLog4j.TestLog4j - Just testing a log message with priority set to WARN2003-12-18 04:23:02:ERROR main TestLog4j.TestLog4j- Just testing a log message with priority set to ERROR2003-12-18 04:23:02:FATAL main TestL

41、og4j.TestLog4j - Just testing a log message with priority set to FATAL2003-12-18 04:23:02:WARN main TestLog4j.TestLog4j - Testing a log message use a alternate form 1.4配置log4j的總結(jié)這個(gè)教程到這里,關(guān)于配置log4j的配置文件的基本原理已經(jīng)講完了,而且通過(guò)例3我們已 經(jīng)可以完成基本的日志工作了。現(xiàn)在,我們就做一個(gè)總結(jié)。配置一個(gè)配置文件的基本步驟如 下:1)定義一個(gè)Logger。在定義Logger時(shí)指定該Logger的級(jí)別級(jí)

42、其輸出目的地。定義Logger 的格式為log4j.rootLogger = level , appendName1, appendName2, appendNameN。2)定義appender的輸出目的地。定義一個(gè)appender的輸出目的地的格式為log4j.appender.appenderName = .of.appender.classlog4j 提供的輸出端有 ConsoleAppender、FileAppender、DailyRollingFileAppender、 RollingFileAppender 和 WriterAppender。3)定義appender的除布局模式外的

43、其它相關(guān)參數(shù),如例3中第6、7、8定義了 A2的相關(guān) 參數(shù)。定義格式為log4j.appender.appenderName.optionName1 = value1 log4j.appender.appenderName.optionNameN = valueN如果除了布局模式外不需要定義別的參數(shù),可跳過(guò)這一步(如例3中的A1)。4)定義appender的布局模式。定義一個(gè)appender的布局模式的格式為 log4j.appender.appenderName.layout = .of.layout.class布局模式其實(shí)也是步驟3)中的一個(gè)部分,只是布局模式參數(shù)是每一個(gè)appender必

44、須定義的參數(shù)。Log4j 提供的布局模式有 HTMLLayout、PatternLayout和 SimpleLayout。定義與所選的布局模式相關(guān)的設(shè)置信息,定義格式為og4j.appender.appenderName.layout.optionName1 = value1 log4j.appender.appenderName.layout.optionNameN = valueN2 記錄器的層次Logger hierarchy2.1何為記錄器的層次hierarchy首先,我們先看一下何為層次,以我們最熟悉的繼承為例,下面是一張類圖在這個(gè)繼承體系中,類B是類C的父類,類A是類C的祖先類,類

45、D是類C的子類。這些 類之間就構(gòu)成一種層次關(guān)系。在這些具有層次關(guān)系的類中,子類都可繼承它的父類的特征, 如類B的對(duì)象能調(diào)用類A中的非private實(shí)例變量和函數(shù);而類C由于繼承自類B,所以類B 的對(duì)象可以同時(shí)調(diào)用類A和類B中的非private實(shí)例變量和函數(shù)。在log4j中,處于不同層次中的Logger也具有象類這樣的繼承關(guān)系。2.2 記錄器的層次如果一個(gè)應(yīng)用中包含了上千個(gè)類,那么也幾乎需要上千個(gè)Logger實(shí)例。如何對(duì)這上千個(gè) Logger實(shí)例進(jìn)行方便地配置,就是一個(gè)很重要的問(wèn)題。Log4J采用了一種樹狀的繼承層次巧 妙地解決了這個(gè)問(wèn)題。在Log4J中Logger是具有層次關(guān)系的。它有一個(gè)共同

46、的根,位于最上 層,其它Logger遵循類似包的層次。下面我們將進(jìn)行介紹。根記錄器 root logger就象一個(gè)Java中的Object類一樣,log4j中的logger層次中有一個(gè)稱之為根記錄器的記錄器, 其它所有的記錄器都繼承自這個(gè)根記錄器。根記錄器有兩個(gè)特征:根記錄器總是存在。就像Java中的Object類一樣,因?yàn)橛胠og4j輸出日志信息是通過(guò)記 錄器來(lái)實(shí)現(xiàn)的,所以只要你應(yīng)用了 log4j,根記錄器就肯定存在的。根記錄器沒(méi)有名稱,所以不能通過(guò)名稱來(lái)取得根記錄器。但在Logger類中提供了getRootLogger()的方法來(lái)取得根記錄器。記錄器的層次Logger遵循類似包的層次。如s

47、tatic Logger rootLog = Logger.getRootLogger();static Logger log1 = Logger.getLogger(test4j);static Logger log2 = Logger.getLogger(test4j.test4j2);static Logger log3 = Logger.getLogger(test4j.test4j2.test4j2);那么rootLog是log2的祖先子記錄器,log1是log2的父子記錄器,log3是log2的子記錄器。記錄器象Java中的類繼承一樣,子記錄器可以繼承父記錄器的設(shè)置信息,也可以可以

48、覆寫 相應(yīng)的信息。首先先看一下記錄器層次中的繼承有什么用處。假設(shè)程序中的每個(gè)包都具有一些基本的日志 信息,而包中的不同包可能會(huì)有些額外的日志信息要輸出,這種情況就可以象處理Java中 的類一樣,運(yùn)用Logger中的層次關(guān)系來(lái)達(dá)到目的。假設(shè)有個(gè)名為A的包,我包下的所有類 都要把日志信息輸出到控制臺(tái)中;A.B包除了輸出到控制臺(tái)外還要輸出到文件中;A.C包除 了輸出到控制臺(tái)中還要輸出到HTML文檔中。這樣我們就可以通過(guò)定義一個(gè)父記錄器A,它 負(fù)責(zé)把日志信息輸出到控制臺(tái)中;定義一個(gè)A的子記錄器A.B,它負(fù)責(zé)把日志信息輸出到文 件中;定義一個(gè)A的子記錄器A.C,它負(fù)責(zé)把日志信息輸出到HTML文檔中。記錄

49、器遵循的是類似包的層次,這樣做為我們帶來(lái)了大大的方便。Logger類中的getLogger() 方法可以取得Logger對(duì)象,這個(gè)方法有三種參數(shù)形式String、Class和URL,其實(shí)不論是用哪 一種,最終都是通過(guò)記錄器的名字來(lái)取得記錄器對(duì)象的。如果要取得一個(gè)名為A.B的記錄器 對(duì)象,我們可以Logger.getLogger( A.B ”)。但從上面的例子中,我們都是通過(guò) Logger.getLogger(TestLog4j.class.getName()這種方法來(lái)取得記錄器對(duì)象。這是為什么呢?現(xiàn) 在我們假設(shè)A.B的包下有一個(gè)類BClass,那么我們調(diào)用BClass.class.getNam

50、e()得到的是這個(gè) 類的全名 A.B.BClass。所以當(dāng)調(diào)用 Logger.getLogger(BClass.class.getName()時(shí),最理想的情況 是返回名為A.B.BClass的記錄器對(duì)象。但是如果不存在名為A.B.BClass的記錄器時(shí)它會(huì)怎樣 呢?其實(shí)通過(guò)Logger類的getLogger方法取得記錄器時(shí)存在下面兩種情況:如果存在與所要找的名字完全相同的記錄器,則返回相應(yīng)的記錄器對(duì)象。當(dāng)調(diào)用 Logger.getLogger(BClass.class.getName()時(shí),如果定義了名為 A.B.BClass 的記錄器,它 就返回該記錄器的對(duì)象。但如果找不到,它會(huì)嘗試返回在記

51、錄器層次中與所要找的記錄器最接近的記錄器對(duì)象。當(dāng)調(diào)用 Logger.getLogger(BClass.class.getName()時(shí),如果沒(méi)有定義了名為 A.B.BClass 的記錄器, 那會(huì)嘗試返回名為A.B的記錄器的對(duì)象;如果又沒(méi)有定義名為A.B的記錄器,它會(huì)嘗試返回 名為A的記錄器的對(duì)象;如果也沒(méi)定義名為A的記錄器,它就會(huì)返回根記錄器的對(duì)象,而 根記錄器是必須存在的,所以你總能得到一個(gè)記錄器對(duì)象。好了,現(xiàn)在我們回到前面的問(wèn)題,我們?yōu)槭裁纯傄ㄟ^(guò) Logger.getLogger(BClass.class.getName()這種以類全名作為參數(shù)來(lái)取得記錄器對(duì)象呢?其實(shí) 這是為了管理方便。

52、因?yàn)槲覀冊(cè)诙x設(shè)計(jì)Logger時(shí)也遵循類似包的規(guī)則,使設(shè)計(jì)器的名稱 與程序中的類包對(duì)應(yīng)。如上面的假設(shè)中我們的程序中有A包,A包下有B包和C包,B包下 又有類BClass,那么我們就可使設(shè)計(jì)器的名為A、A.B、A.C、A.B.BClass,以此類推。那么當(dāng) 我們通過(guò)類命名來(lái)取得設(shè)計(jì)器對(duì)象時(shí),總能取到與所要的設(shè)計(jì)器最接近的設(shè)計(jì)器對(duì)象。2.3如何應(yīng)用記錄器的層次2.3.1如果定義及獲取不同層次的記錄器任何一個(gè)記錄器的使用都有兩個(gè)步驟:1)在配置文件中定義相應(yīng)的記錄器。在配置文件中定義記錄器的格式有兩種?定義根記錄器的格式為log4j.rootLogger = level , appendNamel,

53、 appendName2, .appendNameN?定義一個(gè)非根記錄器的格式為log4j.logger.loggerName1 = level , appendNamel,.appendNameN log4j.logger.loggerNameM = level , appendNamel, .appendNameN 我們可以定義任意個(gè)非根記錄器。2)在代碼中調(diào)用Logger類的取得記錄器方法取得相應(yīng)的記錄器對(duì)象。要取得根記錄器對(duì)象可通過(guò)Logger.getRootLogger()函數(shù),要取得非根記錄器可通過(guò)Logger.getLogger()函數(shù)。理論知道就講到這里,紙上得來(lái)終覺(jué)淺,下面,

54、我們來(lái)小小演練一下。例 4-a:package TestLog4j;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;import org.apache.log4j.Priority;import TestLog4j.TestLog4j2.TestLog4j2;public class TestLog4jstatic Logger logger = Logger.getLogger(TestLog4j.class.getName(); / (2)public TestLog4j()public

55、 static void main(String args)/同時(shí)輸出到控制臺(tái)和一個(gè)文件的實(shí)例并實(shí)現(xiàn)了 Logger的繼承PropertyConfigurator.configure(F:nepalonperties);logger.debug(Start of the main() in TestLog4j);(Just testing a log message with priority set to INFO);logger.warn(Just testing a log message with priority set to WARN);logger.error(Just test

56、ing a log message with priority set to ERROR);logger.fatal(Just testing a log message with priority set to FATAL);logger.log(Priority.WARN, Testing a log message use a alternate form);logger.debug(TestLog4j.class.getName();TestLog4j2 testLog4j2 = new TestLog4j2(); /(1)testLog4j2.testLog();在類TestLog4

57、j中我們調(diào)用了另一個(gè)類TestLog4j2,下面看一下類TestLog4j2的代碼。例 4-b:package TestLog4j.TestLog4j2;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;import org.apache.log4j.Priority;public class TestLog4j2static Logger logger = Logger.getLogger(TestLog4j2.class.getName(); /(1)public TestLog4j2()

58、public void testLog()/同時(shí)輸出到控制臺(tái)和一個(gè)文件的實(shí)例PropertyConfigurator.configure(F:nepalonperties);logger.debug(2Start of the main();(2Just testing a log message with priority set to INFO);logger.warn(2Just testing a log message with priority set to WARN);logger.error(2Just testing a log message with priority s

59、et to ERROR);logger.fatal(2Just testing a log message with priority set to FATAL);logger.log(Priority.DEBUG, Testing a log message use a alternate form); logger.debug(2End of the main();最后我們來(lái)看一下配置文件。例 4-c:perties 文件內(nèi)容#1區(qū)# Use two appenders, one to log to console, another to log to a file log4j.rootL

60、ogger = debug, stdout#2區(qū)#Print only messages of priority WARN or higher for your category log4j.logger.TestLog4j= , Rlog4j.logger.TestLog4j.TestLog4j2=WARN#3區(qū)# First appender writes to consolelog4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.Pattern

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論