隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          一、LOG4J組成

              LOG4J主要由三大組件組成:
              . Logger: 決定什么日志信息應(yīng)該被輸出、什么日志信息應(yīng)該被忽略;
              . Appender: 指定日志信息應(yīng)該輸出到什么地方, 這些地方可以是控制臺(tái)、文件、網(wǎng)絡(luò)設(shè)備;
              . Layout: 指定日志信息的輸出格式;

              一個(gè)Logger可以有多個(gè)Appender,也就是說(shuō)日志信息可以同時(shí)輸出到多個(gè)設(shè)備上,每個(gè)Appender對(duì)應(yīng)
              一種Layout(示例見(jiàn)下圖)。

                        ↗  Appender1  →  Layout
               /    
              Logger
               ﹨  
                        ↘  Appender2  →  Layout


          二、Logger組件

              1. Logger組件提供的方法:

                 Logger組件是LOG4J的核心組件,它代表了Log4J的日志記錄器,它能夠?qū)θ罩拘畔⑦M(jìn)行分類篩選。它由org.apache.log4j.Logger類實(shí)現(xiàn),提供了如下方法:

           

          java 代碼
          1. package org.apache.log4j;   
          2.   
          3. public class Logger {   
          4.   
          5.            // Creation & retrieval methods:   
          6.            public static Logger getRootLogger();   
          7.            public static Logger getLogger(String name);   
          8.   
          9.            // printing methods:   
          10.            public void debug(Object message);   
          11.            public void info(Object message);   
          12.            public void warn(Object message);   
          13.            public void error(Object message);   
          14.            public void fatal(Object message);   
          15.       
          16.            // generic printing method:   
          17.            public void log(Priority p, Object message);   
          18. }   

              2. 在配置文件中配置Logger組件

                 可在Log4J配置文件中配置自己的Logger組件,示例:

                 log4j.logger.myLogger=WARN

                 以上代碼定義了一個(gè)Logger組件,名稱為myLogger,日志級(jí)別為WARN。
           
              3. 日志級(jí)別種類:

                 一共有五種,級(jí)別由高到低依次是:fatal、error、warn、info、debug。獲得Logger實(shí)例后,我們可調(diào)用以下方法之一輸出日志信息:

                 public void debug(Object message);          //輸出debug級(jí)別的日志信息;
                 public void info(Object message);           //輸出info級(jí)別的日志信息;
                 public void warn(Object message);           //輸出warn級(jí)別的日志信息;
                 public void error(Object message);          //輸出error級(jí)別的日志信息;
                 public void fatal(Object message);          //輸出fatal級(jí)別的日志信息;
                 public void log(Priority p, Object message);//輸出參數(shù)Priority指定級(jí)別的日志信息;

                 以上方法只有當(dāng)它的級(jí)別大于或等于Logger組件配置的日志級(jí)別時(shí)才調(diào)用。以前面我們配置的myLogger為例,它的日志級(jí)別為WARN, 那么在程序中,它的warn()、error()、fatal()方法會(huì)被執(zhí)行。對(duì)于log()方法,只有當(dāng)它的參數(shù)Priority指定的日志級(jí)別大于或等于WARN時(shí),它才會(huì)被執(zhí)行。

              4. 為什么需要對(duì)日志進(jìn)行分級(jí)?
             
                 在寫程序的時(shí)候,為了調(diào)試程序,我們會(huì)在很多出錯(cuò)的地方輸出大量的日志信息。當(dāng)程序調(diào)試完,不需要這些信息時(shí),將程序中這些輸出日志信息代碼刪除嗎?這樣費(fèi)時(shí)費(fèi)力,對(duì)于大型程序幾乎不可行。通過(guò)對(duì)日志分級(jí),假如不想輸出WARN級(jí)別的日志信息,則Logger組件的級(jí)別調(diào)高即可,省時(shí)省心。

              5. Logger組件的繼承性

                 Log4J提供了一個(gè)root Logger,它是所有Logger組件的“祖先”,它永遠(yuǎn)存在,且不能通過(guò)名字檢索或引用,通過(guò)Logger.getRootLogger()方法取得它。配置root Logger代碼:

                 log4j.rootLogger=INFO,console

                 可在配置文件中方便地配置存在繼承關(guān)系的Logger組件,凡是在符號(hào)“.”后面的組件都會(huì)成為在符號(hào)“.”前面的Logger組件的子類。例如:

                 log4j.apache.myLogger=WARN
                 log4j.apache.myLogger.mySonLogger=,file

                 以上代碼中, mySonLogger是myLogger的子類Logger組件。Logger組件的繼承關(guān)系:
                 . 如果子類Logger組件沒(méi)有定義日志級(jí)別,則將繼承父類的日志級(jí)別;
                 . 如果子類Logger組件定義了日志級(jí)別,就不會(huì)繼承父類的日志級(jí)別;
                 . 黙認(rèn)情況下,子類Logger組件會(huì)繼承父類所有的Appender,把它們加入到自己的Appener;
                 . 如果把子類Logger組件的additivity標(biāo)志設(shè)為false,那么它就不會(huì)繼承父類Appender。additivity標(biāo)志 默認(rèn)值為false;

                 以上配置的三個(gè)Logger繼承關(guān)系示例如圖:
              
                 root Logger: 日志級(jí)別=INFO  appender清單=console
                                      ↑
                 myLogger: 日志級(jí)別=WARN appender清單=null
                                      ↑
                 mySonLogger: 日志級(jí)別=null appender清單=file

                 這三個(gè)Logger組件實(shí)際日志級(jí)別和Appender如下表:

                 Logger組件          日志級(jí)別          Appender清單
                 root Logger         INFO              console
                 myLogger            WARN              console(繼承)
                 mySonLogger         WARN(繼承)        file,console(繼承)
                
          三、Appender組件

              Appender組件決定將日志信息輸出到什么地方。支持以下目的地:
              . 控制臺(tái)(Console);
              . 文件(File);
              . GUI組件(GUI component);
              . 套接口服務(wù)器(Remote socket server);
              . NT的事件記錄器(NT Event Logger);
              . UNIX Syslog守護(hù)進(jìn)程(Remote UNIX Syslog daemon);

              一個(gè)Logger可同時(shí)對(duì)應(yīng)多個(gè)Appender,示例:myLogger配置二個(gè)Appender: 一個(gè)file, 一個(gè)是console:

              log4j.logger.myAppender=WARN,file,console

              log4j.appender.file=org.apache.log4j.RollingFileAppender
              log4j.appender.file.File=log.txt

              log4j.apender.console=org.apache.log4j.ConsoleAppender

          四、Layout組件

              Layout組件決定日志輸出格式,有以下幾種類型:
              . org.apache.log4j.HTMLLayout(以HTML表格形式布局);
              . org.apache.log4j.PatternLayout(可以靈活地指定布局模式);
              . org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串);
              . org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程和類別等信息);
             
              為名稱為console的Appender配置SimpleLayout,代碼如下:

              log4j.appender.console.layout=org.apache.log4j.SimpleLayout

              輸出日志格式如下:

              WARN - This is a log message from the myLogger
             
              為名稱為file的Appender配置PatternLayout,代碼如下:

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

              輸出日志格式如下:

              THREAD-1 WARN - This is a log message from the myLogger

              PatternLayout讓開(kāi)發(fā)者依照ConversionPattern定義輸出格式。ConversionPattern中一些指定日志內(nèi)容和格式的預(yù)定義符號(hào)說(shuō)明如下:

              符號(hào)         描述
              %r           自程序開(kāi)始后消耗的毫秒數(shù)
              %t           表示日志記錄請(qǐng)求生成的線程
              %p           表示日專語(yǔ)句的優(yōu)先級(jí)
              %r           與日志請(qǐng)求相關(guān)的類別名稱
              %c           日志信息所在的類名
              %m%n         表示日志信息的內(nèi)容

          五、Log4J的基本用法

              1. 定義配置文件
                 Log4J支持二種配置文件格式:XML和Java屬性文件(采用“鍵=值”形式)。以下為Java屬性文件
                 格式配置文件:
               
                 . 配置Logger組件
                  
                   配置root Logger語(yǔ)法為:log4j.rootLogger=[priority],appenderName,appenderName,...
                   配置自定義Logger組件語(yǔ)法為:log4j.logger.loggerName=[priority],appenderName,appenderName,...

                   其中:priority為日志級(jí)別,可選值包括FATAL、ERROR、WARN、INFO、DEBUG、ALL;
                         appenderName指定Appender組件,可指定多個(gè);        

                 . 配置Appender組件

                   配置日志信息輸出目的地Appender, 語(yǔ)法為:
                   log4j.appender.appenderName=fully.ualified.name.of.appender.class
                   log4j.appender.appenderName.option1=value1
                   ...
                   log4j.appender.appenderName.optionN=valueN

                   Log4J提供的Appender有以下幾種:

                   a. org.apache.log4j.ConsoleAppender(控制臺(tái));
                   b. org.apache.log4j.FileAppender(文件);
                   c. org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件);
                   d. org.apache.log4j.RollingFileAppender(文件大小到指定尺寸產(chǎn)生一個(gè)新的文件);
                   e. org.apache.log4j.WriteAppender(將日志信息以流格式發(fā)送到任意指定地方);

                 . 配置Layout組件

                   配置Layout組件語(yǔ)法為:
                   log4j.appender.appenderName.layout=fully.ualified.name.of.appender.class
                   log4j.appender.appenderName.layout.option1=value1
                   ...
                   log4j.appender.appenderName.layout.optionN=valueN

                   下面為一配置文件示例,文件名為log4j.properties:

                   ## LOGGERS ##

                   #configure root logger
                   log4j.rootLogger=INFO,console
                   #define a logger named myLogger
                   log4j.logger.myLogger=WARN
                   #define a second logger that is a child to myLogger
                   log4j.logger.myLogger.mySonLogger=,file

                   ## APPENDERS ##

                   #define an appender named console, which is set to be a ConsoleAppender
                   log4j.appender.console=org.apache.log4j.ConsoleAppender

                   # define an appender named file, which is set to be a RollingFileAppender
                   log4j.appender.file=org.apache.log4j.FileAppender
                   log4j.appender.file.File=log.txt

                   ## LAYOUTS ##
                   # assian a SimpleLayout to console appender
                   log4j.appender.console.layout=org.apache.log4j.SimpleLayout

                   # assian a PatternLayout to file appender
                   log4j.appender.file.layout=org.apache.log4j.PatternLayout
                   log4j.appender.file.layout.ConversionPattern=%t%p-%m%n
                  
              2. 程序中使用Log4j

                 . 獲得日志記錄器:

                   獲得rootLogger:Logger rootLogger=Logger.getRootLogger();
                   獲得自定義Logger:Logger myLogger = Logger.getLogger("log4j.logger.myLogger");

                 . 讀取日志記錄器,配置Log4J環(huán)境;

                   a. BasicConfigurator.configure(): 自動(dòng)快速地使用默認(rèn)Log4J環(huán)境;
                   b. Property.configurator.configure(String configFilename): 讀取使用Java屬性格式的配置文件并配置Log4J環(huán)境;
                   c. DOMConfigurator.configure(String filename): 讀取XML形式的配置文件并配置LOG4J環(huán)境;

                 . 輸出日志信息;

                   在程序代碼中需要生成日志的地方,調(diào)用Logger的各種輸出日志方法輸出不同級(jí)別的日志,例如:
                  
                   myLogger.debug("Thie is a log message from the " + myLogger.getName());

                   下面為一使用Log4J的程序,程序名為Test.java:

          java 代碼
          1.  import org.apache.log4j.Logger;   
          2.  import org.apache.log4j.PropertyConfigurator;   
          3.     
          4.  public class Test {   
          5.   
          6.    public static void main(String[] args) {   
          7.      //Get an instance of the myLogger   
          8.      Logger myLogger = Logger.getLogger("myLogger");   
          9.       
          10.      //Get an instance of the childLogger   
          11.      Logger mySonLogger = Logger.getLogger("myLogger.mySonLogger");   
          12.      //Load the proerties using the PropertyConfigurator   
          13.      PropertyConfigurator.configure("log4j.properties");   
          14.   
          15.      //Log Messages using the Parent Logger   
          16.      myLogger.debug("Thie is a log message from the " + myLogger.getName());   
          17.      myLogger.info("Thie is a log message from the " + myLogger.getName());   
          18.      myLogger.warn("Thie is a log message from the " +  myLogger.getName());   
          19.      myLogger.error("Thie is a log message from the " + myLogger.getName());   
          20.      myLogger.fatal("Thie is a log message from the " + myLogger.getName());   
          21.   
          22.      mySonLogger.debug("Thie is a log message from the " + mySonLogger.getName());   
          23.      mySonLogger.info("Thie is a log message from the " + mySonLogger.getName());   
          24.      mySonLogger.warn("Thie is a log message from the " +  mySonLogger.getName());   
          25.      mySonLogger.error("Thie is a log message from the " + mySonLogger.getName());   
          26.      mySonLogger.fatal("Thie is a log message from the " + mySonLogger.getName());   
          27.    }   
          28. }   

                  程序運(yùn)行結(jié)果為:

                  WARN - Thie is a log message from the myLogger
                  ERROR - Thie is a log message from the myLogger
                  FATAL - Thie is a log message from the myLogger
                  WARN - Thie is a log message from the myLogger.mySonLogger
                  ERROR - Thie is a log message from the myLogger.mySonLogger
                  FATAL - Thie is a log message from the myLogger.mySonLogger

                  另在Test.class所在的目錄下看到一個(gè)log.txt文件,內(nèi)容如下:

                  WARN - Thie is a log message from the myLogger.mySonLogger
                  ERROR - Thie is a log message from the myLogger.mySonLogger
                  FATAL - Thie is a log message from the myLogger.mySonLogger

                  如將配置文件log4j.properties中語(yǔ)句

           log4j.logger.myLogger.mySonLogger=,file

           改為

           log4j.logger.myLogger.mySonLogger=,file,console

           再次運(yùn)行程序,結(jié)果如下:

                  WARN - Thie is a log message from the myLogger
                  ERROR - Thie is a log message from the myLogger
                  FATAL - Thie is a log message from the myLogger
                  WARN - Thie is a log message from the myLogger.mySonLogger
                  WARN - Thie is a log message from the myLogger.mySonLogger
                  ERROR - Thie is a log message from the myLogger.mySonLogger
                  ERROR - Thie is a log message from the myLogger.mySonLogger
                  FATAL - Thie is a log message from the myLogger.mySonLogger         
                  FATAL - Thie is a log message from the myLogger.mySonLogger

                  mySonLogger的日志在控制臺(tái)上輸出了二次,這是因?yàn)閙ySonLogger繼承了父類console Appender,
                  本身又定義了一個(gè)console Appender, 因而有二個(gè)console Appender。

          六、在web應(yīng)用中使用Log4J

              創(chuàng)建一個(gè)Servlet,在它初始化方法中讀取Log4J配置文件并配置Log4J環(huán)境,這個(gè)Servlet在Web應(yīng)用啟
              動(dòng)時(shí)候被加載和初始化,然后就可在其它Web組件中獲取Logger對(duì)象并輸出日志。

              1. 創(chuàng)建用于配置Log4J環(huán)境的Servlet

          java 代碼
          1. import javax.servlet.*;   
          2. import javax.servlet.http.*;   
          3. import java.io.*;   
          4. import java.util.*;   
          5.   
          6. import org.apache.log4j.PropertyConfigurator;   
          7.   
          8. public class Log4JServlet extends HttpServlet {   
          9.       public void init() throws ServletException {   
          10.            String path = getServletContext().getRealPath("/");   
          11.            //getInitParameter("propfile")方法從web.xml文件中讀取Log4J配置文件的名字"profile"。   
          12.            String propfile = path + getInitParameter("propfile");   
          13.            PropertyConfigurator.configure(propfile);   
          14.       }   
          15. }   
          16.   

                該Servlet在web.xml中的配置如下:

          xml 代碼
          1. <servlet>  
          2.   <servlet-name>log4jServlet</servlet-name>  
          3.   <servlet-class>Log4JServlet</servlet-class>  
          4.   <init-param>  
          5.     <param-name>propfile</param-name>  
          6.     <param-value>/WEB-INF/log4j.properties</param-value>  
          7.   </init-param>  
          8.   <load-on-startup>1</load-on-startup>  
          9. </servlet>  

          2. 在login.jsp中輸出日志
                 <%@page import="org.apache.log4j.Logger"%>
                 <html>
                   <head>
                     <title>login</title>
                   </head>
                   <body>
                     <%
                       Logger myLogger = Logger.getLogger("myLogger");
                       Logger mySonLogger = Logger.getLogger("myLogger.mySonLogger");
                       myLogger.debug("Thie is a log message from the " + myLogger.getName());
                       myLogger.info("Thie is a log message from the " + myLogger.getName());
                       myLogger.warn("Thie is a log message from the " +  myLogger.getName());
                       myLogger.error("Thie is a log message from the " + myLogger.getName());
                       myLogger.fatal("Thie is a log message from the " + myLogger.getName());

                       mySonLogger.debug("Thie is a log message from the " + mySonLogger.getName());
                       mySonLogger.info("Thie is a log message from the " + mySonLogger.getName());
                       mySonLogger.warn("Thie is a log message from the " +  mySonLogger.getName());
                       mySonLogger.error("Thie is a log message from the " + mySonLogger.getName());
                       mySonLogger.fatal("Thie is a log message from the " + mySonLogger.getName());
                     %>
                     <br>
                       <form name="loginForm" method="post" action="dispatcher">
                       username: <input type="text" name="username">
                       <br>
                       password: <input type="text" name="password">
                       <br>
                       <input type="submit" name="submit" value="submit">
                     </form>
                   </body>
                 </html>
                        
              3. 發(fā)布運(yùn)行使用Log4J的web應(yīng)用
                 1) 將Log4J的JAR文件拷貝至目錄:<WEB應(yīng)用所在目錄>/WEB-INF/lib
                 2) 創(chuàng)建Log4J的配置文件log4j.properties, 存放目錄為:<WEB應(yīng)用所在目錄>/WEB-INF。內(nèi)容同前面配置文件示例。
                 3) 編譯Log4JServlet, 存放至目錄: <WEB應(yīng)用所在目錄>/WEB-INF/classes
                 4) 修改web.xml文件,加入以下內(nèi)容:

          xml 代碼
          1. <servlet>  
          2.   <servlet-name>log4jServlet</servlet-name>  
          3.   <servlet-class>Log4JServlet</servlet-class>  
          4.   <init-param>  
          5.     <param-name>profile</param-name>  
          6.     <param-value>/WEB-INF/log4j.properties</param-value>  
          7.   </init-param>  
          8.   <load-on-startup>1</load-on-startup>  
          9. </servlet>  


                 5) 啟動(dòng)服務(wù)器,訪問(wèn)login.jsp頁(yè)面,在服務(wù)器控制臺(tái)上看到如下日志:
                    WARN - Thie is a log message from the myLogger
                    ERROR - Thie is a log message from the myLogger
                    FATAL - Thie is a log message from the myLogger
                    WARN - Thie is a log message from the myLogger.mySonLogger
                    ERROR - Thie is a log message from the myLogger.mySonLogger
                    FATAL - Thie is a log message from the myLogger.mySonLogger

                    另在<WEB應(yīng)用所在目錄>/WEB-INF目錄下看到一個(gè)log.txt文件,內(nèi)容如下:

                    WARN - Thie is a log message from the myLogger.mySonLogger
                    ERROR - Thie is a log message from the myLogger.mySonLogger
                    FATAL - Thie is a log message from the myLogger.mySonLogger

          posted on 2009-05-04 17:19 lanxin1020 閱讀(167) 評(píng)論(0)  編輯  收藏 所屬分類: tools

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 高邮市| 资兴市| 长子县| 偏关县| 余庆县| 阿瓦提县| 肇东市| 兴隆县| 闽清县| 明溪县| 阜阳市| 图们市| 汽车| 敦煌市| 深圳市| 武冈市| 宁德市| 克拉玛依市| 朔州市| 全州县| 大同市| 湘乡市| 汉阴县| 隆回县| 和田县| 桐城市| 田阳县| 苗栗市| 河津市| 神农架林区| 柳林县| 托克托县| 长顺县| 马关县| 昌宁县| 南郑县| 兴安县| 珠海市| 嫩江县| 吉木萨尔县| 嘉荫县|