版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、動態(tài)配置log4j的級別。對于log4j的初學者是很有用的。我是個菜鳥,隨便寫了個,別介意。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這樣可以在頁面上實現動態(tài)修改類的log輸出的級別。PropertyConfigurator.configureAndWatch(/WEB-INF/perties, 1000);log4j 自帶有 FileWatchdog 功能:PropertyConfigurator.configureAndWatch(c:/perties,60000);/每分鐘檢測一次文件是否被更改,如果更改,則自動重新讀取配置。DOMConfigurator.configureAndWatch(c:/perties,60000);/xm 配置格
10、式的。動態(tài)配置log4j1配置外部配置文件來配置的基本步驟1.1 一個運用配置文件的實例Log4j之所以能成功的原因之一是它的靈活性。但如果只是簡單的調用 BasicConfigurator.configure()來進行配置工作,那么所有的配置都是在函數中寫死的,以后修 改配置就要修改原代碼,這就不能體現出log4j的靈活性了,所以基本上不會通過BasicConfigurator.configure(來 進行配置工作的。為了增加軟件的靈活性,最常用的做法就是使用配置文件,如web.xml之于J2EE,struts-config.xml之于struts 一樣,log4j也提供了讓我們把配置信息從
11、程序轉移到配置文件 中的方法。Log4j提供了兩種方式的配置文件:XML文件和Java的property配置文件。通過 把配置信息轉移到外部文件中,當我們要修改配置信息時,就可以直接修改配置文件而不用 去修改代碼了,下面,我們就來完成一個通過配置文件來實現log4j的實例。例 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)通過BasicConfigurator類來初始化/BasicConfigurator.configure();/(1)通過配置文件來初始化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)在這個例子中,我們用PropertyConfigurator.configure(F:nepalonperties)代替BasicConfigurator.configure(進行配置。PropertyConfigurator.configure (函數的參數可以是一個 properties文件所在路徑的String對象,可以是一個properties文件所在路徑的URL對象, 也可以是一個pr
15、operties對象。通過PropertyConfigurator.configure()可以通過指定的 properties文件來配置信息。如果要用XML文件進行信息配置,可以在代碼中調用DOMConfigurator()函數來進行配置工作。在這里,我們只以properties文件來完成例子。接 著,我們來看一下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 運行這個實例,運行結果為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下面,我們分析一下這個配置文件。由于每一個Logger對旬都有一個級別,文件的第一行就是定義了一個Logger及其級別。 在這里定義了一個根記錄器(root logger),這涉及到記錄器的層次問題,在些暫時不深入討 論,在后面的章節(jié)再進行討論。第二行定義了一個名為A1的輸出流,這個流就是控制臺,所以通過Logger對象打印的 信息會在控制臺輸出。第三行定義了打印信息的布局。在這里我們用PatternLayout作為此記錄器的布局,PatternLayout允許你以靈活的格式來打印
19、信息。第四行指定的打印信息的具體格式,從結果可知,這個實例的打印格式為:當前打印語 句所使用的時間日志所在的線程打印的級別當前日志所在的類的全名日志信息。現在我們來修改一下這個記錄器的級別,把第一行的DEBUG改為INFO,再運行程序,結果 將變?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由于這個Logger的級別變?yōu)镮NFO,而代碼(2)是調用debug()函數來輸出日志信息時只
21、能 當記錄器級別為DEBUG時才輸出信息,所以代碼(2)將不輸出信息。1.2實例原理1.2.1初始化配置信息如果要通過JAVA的properties文件來配置信息,那么在代碼中就要通過 PropertyConfigurator.configure(函數從properties文件中加載配置信息,這個函數有三種參數 形式:一個properties文件所在路徑的String對象,可以是一個properties文件所在路徑的 URL對象,也可以是一個properties對象。如果要用XML文件來配置信息,則可用類型的 DOMConfigurator()函數來從一個XML文件中加載配置信息。1.2.2
22、輸出端 Appender在上面的例子中,我們都是簡單的把日志信息輸出到控制臺中。其實在log4j中還可以把日 志信息輸出到其它的輸出端,對于同一個日志信息,我們還可以讓它同時輸出到多個輸出端 中,如同時在控制臺和文件中進行打印。一個輸出端就是一個appender。要在配置文件中 定義一個appender有三步:1)在定義一個記錄器的同時定義出該記錄器的輸出端appender。在例2的配置文件的第一 句log4j.rootLogger = DEBUG, A1中,我們定義了一個根記錄器,它的級別為DEBUG,它有一 個 appender 名為 A1。定義根記錄器的格式為 log4j.rootLog
23、ger = level , appendName1, appendName2, appendNameN。同一個記錄器可有多個輸出端。2)定義appender的輸出目的地。定義一個appender的輸出目的地的格式為 log4j.appender.appenderName = .of.appender.clas。log4j 提供了 以下幾種 常用的輸出目的地:? org.apache.log4j.ConsoleAppender,將日志信息輸出到控制臺? org.apache.log4j.FileAppender,將日志信息輸出到一個文件? org.apache.log4j.DailyRollin
24、gFileAppender,將日志信息輸出到一個,并且每天輸出到一個新 的日志文件? org.apache.log4j.RollingFileAppender,將日志信息輸出到一個文件,通過指定文件的的尺寸, 當文件大小到達指定尺寸的時候會自動把文件改名,如名為example.log的文件會改名為 example.log.1,同時產生一個新的example.log文件。如果新的文件再次達到指定尺寸,又 會自動把文件改名為example.log.2,同時產生一個example.log文件。依此類推,直到 example.log. MaxBackupIndex, MaxBackupIndex 的值
25、可在配置文件中定義。? org.apache.log4j.WriterAppender,將日志信息以流格式發(fā)送到任意指定的地方。? org.apache.log4j.jdbc.JDBCAppender,通過JDBC把日志信息輸出到數據庫中。在例 2 中,log4j.appender.A1 = org.apache.log4j.ConsoleAppender定義了名為 A1 的 appender 的輸出目的地為控制臺,所以日志信息將輸出到控制臺。3)定義與所選的輸出目的地相關的參數,定義格式為:log4j.appender.appenderName.optionName1 = value1 lo
26、g4j.appender.appenderName.optionNameN = valueN其中一個最常用的參數layout將在下面介紹。1.2.3 輸出格式(布局)layout通過appender可以控制輸出的目的地,而如果要控制輸出的格式,就可通過log4j的layout 組件來實現。通過配置文件定義一個appender的輸出格式,也通常需要兩個步驟:1)定義appender的布局模式。定義一個appender的布局模式的格式為log4j.appender.appenderName.layout = .of.layout.class Log4j 提供的布局模 式有以下幾種:? org.ap
27、ache.log4j.HTMLLayout,以 HTML表格形式布局? org.apache.log4j.PatternLayout,可以靈活地指定布局模式? org.apache.log4j.SimpleLayout,包含日志信息的級別和信息字符串在例 2 中 log4j.appender.A1.layout = org.apache.log4j.PatternLayout 定義了名為 A1 的 appender 的布局模式為 PatternLayout。2)定義與所選的布局模式相關的設置信息,定義格式為:log4j.appender.appenderName.layout.optionNa
28、me1 = value1 log4j.appender.appenderName.layout.optionNameN = valueN選擇了不同的布局模式可能會有不同的設置信息。實例2所選的布局模式PatternLayout的 一個PatternLayout為ConversionPattern,通過定義這個PatternLayout的值,我們可以指定 輸出信息的輸出格式。在例2的配置文件中的定義如下 log4j.appender.A1.layout.ConversionPattern = %-4r %t %-5p %c %x - %m%n。在下面,我們將 介紹布局模式PatternLayou
29、t的參數ConversionPattern的各個值代表的含義。1.2.4 ConversionPattern 參數的格式含義格式名含義%c輸出日志信息所屬的類的全名%d輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%dyyy-MM-dd HH:mm:ss ,輸出類似:2002-10-18-22: 10: 28%f輸出日志信息所屬的類的類名%l輸出日志事件的發(fā)生位置,即輸出日志信息的語句處于它所在的類的第幾行%m輸出代碼中指定的信息,如log(message)中的message%n輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”%p輸出優(yōu)
30、先級,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則 為DEBUG,依此類推%r輸出自應用啟動到輸出該日志信息所耗費的毫秒數%t輸出產生該日志事件的線程名1.3定義多個輸出目的地的實例從上面的實例原理中我們已經知道,同一個日志信息可以同時輸出到多個輸出目的地,在這 個例子中,我們將實現一個把日志信息同時輸出到控制器、一個文件中的實例和數據庫中。 這個實例的Java代碼我們沿用例2中的代碼,我們只需修改配置文件即可。這也體現了 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定義了兩個輸出端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要輸出到哪一個文件log4j.a
33、ppender.A2.File = F:nepalonclassesexample3.log#7定義A2的輸出文件的最大長度log4j.appender.A2.MaxFileSize = 1KB#8定義A2的備份文件數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輸出到數據庫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的特有參數及其運用的方法。 11區(qū)顯示了輸出端為JDBCAppend
36、er的特有參數及其運用方法。在這著重講解一下6、7、8 行的作用。6行指定日志信息輸出到哪個文件,7行指定日志文件的最大長度,最后要詳細 介紹8行。第8行的參數是設置備份文件的個數的參數,在這里我們設置為3,表示最多有 3個備份文件,具體作用為:當example3.log文件的大小超過K時,就把文件改名為example3.log.1,同時生成一個新 的 example3.log 文件當example3.log文件的大小再次超過1K,又把文件改名為example3.log.1。但由于此時 example3.log.1 已存在,則先把 example3.log.1 更名為 example3.log
37、.2,再把 example3.log 文 件改名為 example3.log.13)同理,當example3.log文件的大小再次超過 1K,先把example3.log.2文件更名為 example3.log.3,把 example3.log.1 文件更名為 example3.log.2,再把 example3.log 文件改名 為 example3.log.14)當example3.log文件的大小再次超過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 文件。運行結果將分為兩部分在控制器中: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的總結這個教程到這里,關于配置log4j的配置文件的基本原理已經講完了,而且通過例3我們已 經可以完成基本的日志工作了?,F在,我們就做一個總結。配置一個配置文件的基本步驟如 下:1)定義一個Logger。在定義Logger時指定該Logger的級別級
42、其輸出目的地。定義Logger 的格式為log4j.rootLogger = level , appendName1, appendName2, appendNameN。2)定義appender的輸出目的地。定義一個appender的輸出目的地的格式為log4j.appender.appenderName = .of.appender.classlog4j 提供的輸出端有 ConsoleAppender、FileAppender、DailyRollingFileAppender、 RollingFileAppender 和 WriterAppender。3)定義appender的除布局模式外的
43、其它相關參數,如例3中第6、7、8定義了 A2的相關 參數。定義格式為log4j.appender.appenderName.optionName1 = value1 log4j.appender.appenderName.optionNameN = valueN如果除了布局模式外不需要定義別的參數,可跳過這一步(如例3中的A1)。4)定義appender的布局模式。定義一個appender的布局模式的格式為 log4j.appender.appenderName.layout = .of.layout.class布局模式其實也是步驟3)中的一個部分,只是布局模式參數是每一個appender必
44、須定義的參數。Log4j 提供的布局模式有 HTMLLayout、PatternLayout和 SimpleLayout。定義與所選的布局模式相關的設置信息,定義格式為og4j.appender.appenderName.layout.optionName1 = value1 log4j.appender.appenderName.layout.optionNameN = valueN2 記錄器的層次Logger hierarchy2.1何為記錄器的層次hierarchy首先,我們先看一下何為層次,以我們最熟悉的繼承為例,下面是一張類圖在這個繼承體系中,類B是類C的父類,類A是類C的祖先類,類
45、D是類C的子類。這些 類之間就構成一種層次關系。在這些具有層次關系的類中,子類都可繼承它的父類的特征, 如類B的對象能調用類A中的非private實例變量和函數;而類C由于繼承自類B,所以類B 的對象可以同時調用類A和類B中的非private實例變量和函數。在log4j中,處于不同層次中的Logger也具有象類這樣的繼承關系。2.2 記錄器的層次如果一個應用中包含了上千個類,那么也幾乎需要上千個Logger實例。如何對這上千個 Logger實例進行方便地配置,就是一個很重要的問題。Log4J采用了一種樹狀的繼承層次巧 妙地解決了這個問題。在Log4J中Logger是具有層次關系的。它有一個共同
46、的根,位于最上 層,其它Logger遵循類似包的層次。下面我們將進行介紹。根記錄器 root logger就象一個Java中的Object類一樣,log4j中的logger層次中有一個稱之為根記錄器的記錄器, 其它所有的記錄器都繼承自這個根記錄器。根記錄器有兩個特征:根記錄器總是存在。就像Java中的Object類一樣,因為用log4j輸出日志信息是通過記 錄器來實現的,所以只要你應用了 log4j,根記錄器就肯定存在的。根記錄器沒有名稱,所以不能通過名稱來取得根記錄器。但在Logger類中提供了getRootLogger()的方法來取得根記錄器。記錄器的層次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中的類繼承一樣,子記錄器可以繼承父記錄器的設置信息,也可以可以
48、覆寫 相應的信息。首先先看一下記錄器層次中的繼承有什么用處。假設程序中的每個包都具有一些基本的日志 信息,而包中的不同包可能會有些額外的日志信息要輸出,這種情況就可以象處理Java中 的類一樣,運用Logger中的層次關系來達到目的。假設有個名為A的包,我包下的所有類 都要把日志信息輸出到控制臺中;A.B包除了輸出到控制臺外還要輸出到文件中;A.C包除 了輸出到控制臺中還要輸出到HTML文檔中。這樣我們就可以通過定義一個父記錄器A,它 負責把日志信息輸出到控制臺中;定義一個A的子記錄器A.B,它負責把日志信息輸出到文 件中;定義一個A的子記錄器A.C,它負責把日志信息輸出到HTML文檔中。記錄
49、器遵循的是類似包的層次,這樣做為我們帶來了大大的方便。Logger類中的getLogger() 方法可以取得Logger對象,這個方法有三種參數形式String、Class和URL,其實不論是用哪 一種,最終都是通過記錄器的名字來取得記錄器對象的。如果要取得一個名為A.B的記錄器 對象,我們可以Logger.getLogger( A.B ”)。但從上面的例子中,我們都是通過 Logger.getLogger(TestLog4j.class.getName()這種方法來取得記錄器對象。這是為什么呢?現 在我們假設A.B的包下有一個類BClass,那么我們調用BClass.class.getNam
50、e()得到的是這個 類的全名 A.B.BClass。所以當調用 Logger.getLogger(BClass.class.getName()時,最理想的情況 是返回名為A.B.BClass的記錄器對象。但是如果不存在名為A.B.BClass的記錄器時它會怎樣 呢?其實通過Logger類的getLogger方法取得記錄器時存在下面兩種情況:如果存在與所要找的名字完全相同的記錄器,則返回相應的記錄器對象。當調用 Logger.getLogger(BClass.class.getName()時,如果定義了名為 A.B.BClass 的記錄器,它 就返回該記錄器的對象。但如果找不到,它會嘗試返回在記
51、錄器層次中與所要找的記錄器最接近的記錄器對象。當調用 Logger.getLogger(BClass.class.getName()時,如果沒有定義了名為 A.B.BClass 的記錄器, 那會嘗試返回名為A.B的記錄器的對象;如果又沒有定義名為A.B的記錄器,它會嘗試返回 名為A的記錄器的對象;如果也沒定義名為A的記錄器,它就會返回根記錄器的對象,而 根記錄器是必須存在的,所以你總能得到一個記錄器對象。好了,現在我們回到前面的問題,我們?yōu)槭裁纯傄ㄟ^ Logger.getLogger(BClass.class.getName()這種以類全名作為參數來取得記錄器對象呢?其實 這是為了管理方便。
52、因為我們在定義設計Logger時也遵循類似包的規(guī)則,使設計器的名稱 與程序中的類包對應。如上面的假設中我們的程序中有A包,A包下有B包和C包,B包下 又有類BClass,那么我們就可使設計器的名為A、A.B、A.C、A.B.BClass,以此類推。那么當 我們通過類命名來取得設計器對象時,總能取到與所要的設計器最接近的設計器對象。2.3如何應用記錄器的層次2.3.1如果定義及獲取不同層次的記錄器任何一個記錄器的使用都有兩個步驟:1)在配置文件中定義相應的記錄器。在配置文件中定義記錄器的格式有兩種?定義根記錄器的格式為log4j.rootLogger = level , appendNamel,
53、 appendName2, .appendNameN?定義一個非根記錄器的格式為log4j.logger.loggerName1 = level , appendNamel,.appendNameN log4j.logger.loggerNameM = level , appendNamel, .appendNameN 我們可以定義任意個非根記錄器。2)在代碼中調用Logger類的取得記錄器方法取得相應的記錄器對象。要取得根記錄器對象可通過Logger.getRootLogger()函數,要取得非根記錄器可通過Logger.getLogger()函數。理論知道就講到這里,紙上得來終覺淺,下面,
54、我們來小小演練一下。例 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)/同時輸出到控制臺和一個文件的實例并實現了 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中我們調用了另一個類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()/同時輸出到控制臺和一個文件的實例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();最后我們來看一下配置文件。例 4-c:perties 文件內容#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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 虛擬現實在木材加工質量檢測中的應用-洞察分析
- 相對論引力波源-洞察分析
- 維修人員職業(yè)素養(yǎng)提升-洞察分析
- 物權法司法解釋研究-洞察分析
- 網頁設計安全策略-洞察分析
- 網絡金融風險管理-第1篇-洞察分析
- 無人值守油氣開采站實踐-洞察分析
- 虛擬現實在協(xié)同設計中的應用-洞察分析
- 學習風格與教學策略匹配-洞察分析
- 醫(yī)護抗疫個人先進事跡材料(5篇)
- 青海省全省市縣鄉(xiāng)鎮(zhèn)衛(wèi)生院街道社區(qū)衛(wèi)生服務中心基本公共衛(wèi)生服務醫(yī)療機構信息名單目錄450家
- 網絡暴力的法律規(guī)制開題報告
- 水泥混凝土路面施工方案85171
- 泰康人壽養(yǎng)老社區(qū)介紹課件
- T∕CSTM 00584-2022 建筑用晶體硅光伏屋面瓦
- 環(huán)境保護知識培訓
- 《民航服務禮儀》項目五 地面服務禮儀
- 最新干部(職工)基本信息審核表格式
- 國家開放大學實驗學院生活中的法律第二單元測驗答案
- 高級社會工作師直接服務個案(老年社會工作服務個案案例)
- DB23∕T 1019-2020 黑龍江省建筑工程資料管理標準
評論
0/150
提交評論