posts - 495,comments - 227,trackbacks - 0
          Log4j基本使用方法

          作者:佚名 ????來(lái)自:未知

            Log4j由三個(gè)重要的組件構(gòu)成:日志信息的優(yōu)先級(jí),日志信息的輸出目的地,日志信息的輸出格式。日志信息的優(yōu)先級(jí)從高到低有ERROR、WARN、INFO、DEBUG,分別用來(lái)指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制臺(tái)還是文件中;而輸出格式則控制了日志信息的顯示內(nèi)容。

            一、定義配置文件

            其實(shí)您也可以完全不使用配置文件,而是在代碼中配置Log4j環(huán)境。但是,使用配置文件將使您的應(yīng)用程序更加靈活。Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。下面我們介紹使用Java特性文件做為配置文件的方法:

            1.配置根Logger,其語(yǔ)法為:

            log4j.rootLogger = [ level ] , appenderName, appenderName, …

            其中,level 是日志記錄的優(yōu)先級(jí),分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級(jí)別。Log4j建議只使用四個(gè)級(jí)別,優(yōu)先級(jí)從高到低分別是ERROR、WARN、INFO、DEBUG。通過(guò)在這里定義的級(jí)別,您可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開(kāi)關(guān)。比如在這里定義了INFO級(jí)別,則應(yīng)用程序中所有DEBUG級(jí)別的日志信息將不被打印出來(lái)。 appenderName就是指定日志信息輸出到哪個(gè)地方。您可以同時(shí)指定多個(gè)輸出目的地。

            2.配置日志信息輸出目的地Appender,其語(yǔ)法為:

            log4j.appender.appenderName = fully.qualified.name.of.appender.class
            log4j.appender.appenderName.option1 = value1
            …
            log4j.appender.appenderName.option = valueN

            其中,Log4j提供的appender有以下幾種:
            org.apache.log4j.ConsoleAppender(控制臺(tái)),
            org.apache.log4j.FileAppender(文件),
            org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件),
            org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件),
            org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)

            3.配置日志信息的格式(布局),其語(yǔ)法為:

            log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
            log4j.appender.appenderName.layout.option1 = value1
            …
            log4j.appender.appenderName.layout.option = valueN

            其中,Log4j提供的layout有以下幾種:
            org.apache.log4j.HTMLLayout(以HTML表格形式布局),
            org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
            org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
            org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)

            Log4J采用類似C語(yǔ)言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)如下: %m 輸出代碼中指定的消息

            %p 輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
            %r 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
            %c 輸出所屬的類目,通常就是所在類的全名
            %t 輸出產(chǎn)生該日志事件的線程名
            %n 輸出一個(gè)回車換行符,Windows平臺(tái)為“\r\n”,Unix平臺(tái)為“\n”
            %d 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
            %l 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:10)

            二、在代碼中使用Log4j

            1.得到記錄器

            使用Log4j,第一步就是獲取日志記錄器,這個(gè)記錄器將負(fù)責(zé)控制日志信息。其語(yǔ)法為:

            public static Logger getLogger( String name)

            通過(guò)指定的名字獲得記錄器,如果必要的話,則為這個(gè)名字創(chuàng)建一個(gè)新的記錄器。Name一般取本類的名字,比如:

            static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

            2.讀取配置文件

            當(dāng)獲得了日志記錄器之后,第二步將配置Log4j環(huán)境,其語(yǔ)法為:

            BasicConfigurator.configure (): 自動(dòng)快速地使用缺省Log4j環(huán)境。
            PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性文件編寫(xiě)的配置文件。
            DOMConfigurator.configure ( String filename ) :讀取XML形式的配置文件。

            3.插入記錄信息(格式化日志信息)

            當(dāng)上兩個(gè)必要步驟執(zhí)行完畢,您就可以輕松地使用不同優(yōu)先級(jí)別的日志記錄語(yǔ)句插入到您想記錄日志的任何地方,其語(yǔ)法如下:

            Logger.debug ( Object message ) ;
            Logger.info ( Object message ) ;
            Logger.warn ( Object message ) ;
            Logger.error ( Object message ) ;



          log4j使用示例
          2006-08-20 13:34
          log4j使用示例
          --by blues(zhaochaohua@sina.com)
          PART 1 介紹
          log4j的好處在于:
          1.通過(guò)修改配置文件,就可以決定log信息輸出到何處(console,文件,...),是否輸出。
          這樣,在系統(tǒng)開(kāi)發(fā)階段可以打印詳細(xì)的log信息以跟蹤系統(tǒng)運(yùn)行情況,而在系統(tǒng)穩(wěn)定后可以關(guān)閉log輸出,從而在能跟蹤系統(tǒng)運(yùn)行情況的同時(shí),又減少了垃圾代碼(System.out.println(...)等)。
          2.使用log4j,需要整個(gè)系統(tǒng)有一個(gè)統(tǒng)一的log機(jī)制,有利于系統(tǒng)的規(guī)劃。

          log4j的使用本身很簡(jiǎn)單。但合理地規(guī)劃一個(gè)系統(tǒng)的統(tǒng)一log機(jī)制需要周全的考慮。

          其他關(guān)于log4j的信息參看log4j自帶的文檔。

          PART II 配置文件詳細(xì)解釋
          先看一個(gè)配置文件的例子:
          1.配置文件的例子
          log4j.rootLogger=DEBUG
          #將DAO層log記錄到DAOLog,allLog中
          log4j.logger.DAO=DEBUG,A2,A4
          #將邏輯層log記錄到BusinessLog,allLog中
          log4j.logger.Businesslog=DEBUG,A3,A4
          #A1--打印到屏幕上
          log4j.appender.A1=org.apache.log4j.ConsoleAppender
          log4j.appender.A1.layout=org.apache.log4j.PatternLayout
          log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n
          #A2--打印到文件DAOLog中--專門(mén)為DAO層服務(wù)
          log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
          log4j.appender.A2.file=DAOLog
          log4j.appender.A2.DatePattern='.'yyyy-MM-dd
          log4j.appender.A2.layout=org.apache.log4j.PatternLayout
          log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

          #A3--打印到文件BusinessLog中--專門(mén)記錄邏輯處理層服務(wù)log信息
          log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender
          log4j.appender.A3.file=BusinessLog
          log4j.appender.A3.DatePattern='.'yyyy-MM-dd
          log4j.appender.A3.layout=org.apache.log4j.PatternLayout
          log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

          #A4--打印到文件alllog中--記錄所有l(wèi)og信息
          log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
          log4j.appender.A4.file=alllog
          log4j.appender.A4.DatePattern='.'yyyy-MM-dd
          log4j.appender.A4.layout=org.apache.log4j.PatternLayout
          log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n


          2.Appender的使用
          一個(gè)Appender代表log信息要寫(xiě)向的一個(gè)地方。log4j可使用的Appender有很多類型,這里只考慮3種:ConsoleAppender,FileAppender,DailyRollFileAppender
          2.1 ConsoleAppender
          如果使用ConsoleAppender,那么log信息將寫(xiě)到Console。就是直接把信息打印到System.out上了。
          2.2 FileAppender
          使用FileAppender,那么log信息將寫(xiě)到指定的文件中。這應(yīng)該是比較經(jīng)常使用到的情況。
          相應(yīng)地,在配置文件中應(yīng)該指定log輸出的文件名。如下配置指定了log文件名為demo.txt
          log4j.appender.A2.File=demo.txt
          注意將A2替換為具體配置中Appender的別名。
          2.3 DailyRollingAppender
          使用FileAppender可以將log信息輸出到文件中,但是如果文件太大了讀起來(lái)就不方便了。這時(shí)就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息輸出到按照日期來(lái)區(qū)分的文件中。如下配置文件就會(huì)每天產(chǎn)生一個(gè)log文件,每個(gè)log文件只記錄當(dāng)天的log信息:

          log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
          log4j.appender.A2.file=demo
          log4j.appender.A2.DatePattern='.'yyyy-MM-dd
          log4j.appender.A2.layout=org.apache.log4j.PatternLayout
          log4j.appender.A2.layout.ConversionPattern=%m%n


          3.Layout的配置
          Layout指定了log信息輸出的樣式。
          詳細(xì)信息請(qǐng)查看PatternLayout的javadoc。
          例子1:顯示日期和log信息
          log4j.appender.A2.layout=org.apache.log4j.PatternLayout
          log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n
          打印的信息是:
          2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc

          例子2:顯示日期,log發(fā)生地方和log信息
          log4j.appender.A2.layout=org.apache.log4j.PatternLayout
          log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n
          2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) "#" SELECT * FROM Role WHERE 1=1 order by createDate desc


          例子3:顯示log級(jí)別,時(shí)間,調(diào)用方法,log信息
          log4j.appender.A2.layout=org.apache.log4j.PatternLayout
          log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
          log信息:
          DEBUG??2002-11-12 12:00:57,376 method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)
          SELECT * FROM Role WHERE 1=1 order by createDate desc


          PART 3 log4j的使用
          log4j使用步驟有3個(gè):
          3.1.根據(jù)配置文件初始化log4j
          配置文件如PART 2所敘述。現(xiàn)在講的是如何在程序中配置log4j。
          log4j可以使用3中配置器來(lái)初始化:BasicConfigurator,DOMConfigurator,PropertyConfigurator
          這里用的是PropertyConfigurator。使用PropertyConfigurator適用于所有的系統(tǒng)。
          如下的語(yǔ)句
          PropertyConfigurator.configure("log4j.properties");
          就以log4j.properties為配置文件初始化好了log4j環(huán)境。
          注意一點(diǎn):這個(gè)語(yǔ)句只需要在系統(tǒng)啟動(dòng)的時(shí)候執(zhí)行一次。例如:在unet webOA項(xiàng)目中可以這么用:
          在ActionServlet的init()方法中調(diào)用一次。
          public class ActionServlet extends HttpServlet{
          ...
          /**
          * Initialize global variables
          */
          public void init() throws ServletException {
          // 初始化Action資源
          try{
          initLog4j();
          ...
          }catch(IOException e){
          throw new ServletException("Load ActionRes is Error");
          }
          }
          ...
          protected void initLog4j(){
          PropertyConfigurator.configure("log4j.properties");
          }
          ...
          }//end class ActionServlet

          3.2 在需要使用log4j的地方獲取Logger實(shí)例
          如下是RoleDAO類中的使用例子:
          static Logger log = Logger.getLogger("DAO");
          注意這里使用"DAO"標(biāo)識(shí)符,那么對(duì)應(yīng)的在配置文件中對(duì)應(yīng)的配置信息如下:

          #定義DAO Logger
          log4j.logger.DAO=DEBUG,A2
          #設(shè)置Appender A2的屬性
          log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
          log4j.appender.A2.file=demo
          log4j.appender.A2.DatePattern='.'yyyy-MM-dd
          log4j.appender.A2.layout=org.apache.log4j.PatternLayout
          log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n

          public class RoleDAO extends BaseDBObject
          {
          ...
          static Logger log = Logger.getLogger("DAO");
          ...
          public BeanCollection selectAll() throws SQLException
          {
          StringBuffer sql = new StringBuffer(SQLBUF_LEN);
          sql.append("SELECT * FROM " + tableName + " order by roldId");
          //System.out.println(sql.toString());
          log.debug(sql);
          ...
          }
          ...
          }

          3.3 使用Logger對(duì)象的debug,info,fatal...方法
          log.debug("it is the debug info");

          附件1:log4j的一個(gè)bug
          當(dāng)這樣使用時(shí),DailyRollingFileAppender不能正確使用:
          public Class RoleDAO(){

          static Logger log = Logger.getLogger("DAO");

          //在每一次new RoleDAO對(duì)象的時(shí)候都執(zhí)行一次configure()操作
          public RoleDAO(TransactionManager transMgr) throws SQLException
          {
          ...
          PropertyConfigurator.configure("log4j.properties");
          ...
          }

          public void select(){
          ...
          //使用log4j進(jìn)行l(wèi)og記錄
          log.debug("...");
          ...
          }
          }
          Log4J采用類似C語(yǔ)言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)見(jiàn)表1如下:


          %m 輸出代碼中指定的消息
          %p 輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
          %r 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
          %c 輸出所屬的類目,通常就是所在類的全名
          %t 輸出產(chǎn)生該日志事件的線程名
          %n 輸出一個(gè)回車換行符,Windows平臺(tái)為“\r\n”,Unix平臺(tái)為“\n”
          %d 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
          %l 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:10)

            

          基本應(yīng)用


          Log4J的配置

          現(xiàn)在來(lái)看log4j.properties配置文件的意義。第一行指定了根Logger的級(jí)別是DEBUG,并將此指定輸出到A1。A1就是第二行定義的org.apache.log4j.ConsoleAppender,此行表示將A1輸出到控制臺(tái)。第三行規(guī)定了輸出到A1的格式為org.apache.log4j.PatternLayout。第四行規(guī)定了輸出到A1格式的轉(zhuǎn)換模式為org.javaresearch.log4j.TestLog4J。

          很多成熟的服務(wù)器類的軟件日志信息會(huì)輸出到控制臺(tái),同時(shí)輸出到日志文件備查。使用Log4J可以在不改變?nèi)魏未a的情況下,僅通過(guò)修改配置文件就可以輕松地完成這項(xiàng)功能。相關(guān)配置文件如下:

          #### Use two appenders, one to log to console, another to log to a file
          log4j.rootCategory=debug, stdout, R

          # Print only messages of priority WARN or higher for your category
          log4j.category.your.category.name=WARN

          #### First appender writes to console
          log4j.appender.stdout=org.apache.log4j.ConsoleAppender
          log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

          # Pattern to output the caller's file name and line number.
          log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

          #### Second appender writes to a file
          log4j.appender.R=org.apache.log4j.RollingFileAppender
          log4j.appender.R.File=example.log

          # Control the maximum log file size
          log4j.appender.R.MaxFileSize=100KB
          # Archive log files (one backup file here)
          log4j.appender.R.MaxBackupIndex=1

          log4j.appender.R.layout=org.apache.log4j.PatternLayout
          log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

          ?

          這個(gè)配置文件指定了兩個(gè)輸出源stdout和R。前者把日志信息輸出到控制臺(tái),后者是一個(gè)輪轉(zhuǎn)日志文件。最大的文件是100KB,當(dāng)一個(gè)日志文件達(dá)到最大尺寸時(shí),Log4J會(huì)自動(dòng)把example.log重命名為example.log.1,然后重建一個(gè)新的example.log文件,依次輪轉(zhuǎn)。

          在Web應(yīng)用中使用

          在Web應(yīng)用中,應(yīng)該在哪兒對(duì)Log4J進(jìn)行配置呢?首先要明確,Log4J必須在應(yīng)用的其它代碼執(zhí)行前完成初始化。因?yàn)镾ervlet是在Web服務(wù)器啟動(dòng)時(shí)立即裝入的,所以,在Web應(yīng)用中一般使用一個(gè)專門(mén)的Servlet來(lái)完成Log4J的配置,并保證在web.xml的配置中,這個(gè)Servlet位于其它Servlet之前。下面是一個(gè)例子,代碼如下:

          package org.javaresearch.log4j;
          import java.io.*;
          import javax.servlet.*;
          import org.apache.log4j.*;
          public class Log4JInit extends HttpServlet {
          public void init() throws ServletException {
          String prefix = getServletContext().getRealPath("/");
          String file = getServletConfig().getInitParameter("log4j-config-file");
          // 從Servlet參數(shù)讀取log4j的配置文件
          if (file != null) {
          PropertyConfigurator.configure(prefix + file);
          }
          }
          public void doGet(HttpServletRequest request,HttpServletResponse response)throws
          IOException, ServletException {}
          public void doPost(HttpServletRequest request,HttpServletResponse response)throws
          IOException, ServletException {}
          }

          ?

          <servlet>
          <servlet-name>log4jinit</servlet-name>
          <servlet-class>org.javaresearch. log4j.Log4JInit</servlet-class>
          <init-param>
          <param-name> log4j-config-file </param-name>
          <param-value>/properties/log4j.properties</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
          </servlet>

          ?

          注意:上面的load-on-startup應(yīng)設(shè)為1,以便在Web容器啟動(dòng)時(shí)即裝入該Servlet。log4j.properties文件放在根的properties子目錄中,也可以把它放在其它目錄中。應(yīng)該把.properties文件集中存放,這樣方便管理。
          posted on 2006-10-16 13:06 SIMONE 閱讀(259) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 凤台县| 满洲里市| 文水县| 兰坪| 肥东县| 琼中| 枣阳市| 江阴市| 琼结县| 河间市| 封丘县| 右玉县| 五指山市| 蚌埠市| 霞浦县| 宜黄县| 利川市| 马鞍山市| 太仓市| 蚌埠市| 唐山市| 兰坪| 融水| 青川县| 乌兰浩特市| 易门县| 桃江县| 溧水县| 图木舒克市| 永福县| 陇南市| 柞水县| 盐亭县| 玉林市| 拉萨市| 含山县| 丰都县| 万荣县| 安福县| 长武县| 都兰县|