1. 程式人生 > >Log4j在Java中的使用

Log4j在Java中的使用

一、LOG4J組成

LOG4J主要由三大元件組成:
- Logger: 決定什麼日誌資訊應該被輸出、什麼日誌資訊應該被忽略;
- Appender: 指定日誌資訊應該輸出到什麼地方, 這些地方可以是控制檯、檔案、網路裝置;
- Layout: 指定日誌資訊的輸出格式;

一個Logger可以有多個Appender,也就是說日誌資訊可以同時輸出到多個裝置上,每個Appender對應
一種Layout(示例見下圖)。

          ↗  Appender1  →  Layout
 /     
Logger
 ﹨  
          ↘  Appender2  →  Layout

二、Logger元件

1. Logger元件提供的方法:

   Logger元件是LOG4J的核心元件,它代表了Log4J的日誌記錄器,它能夠對日誌資訊進行分類篩選。它由org.apache.log4j.Logger類實現,提供瞭如下方法:

java 程式碼

package org.apache.log4j;   

public class Logger {   

           // Creation & retrieval methods:   
           public static Logger getRootLogger();   
           public
static Logger getLogger(String name); // printing methods: public void debug(Object message); public void info(Object message); public void warn(Object message); public void error(Object message); public void fatal(Object message); // generic printing method:
public void log(Priority p, Object message); }

2. 在配置檔案中配置Logger元件

   可在Log4J配置檔案中配置自己的Logger元件,示例:

   log4j.logger.myLogger=WARN

   以上程式碼定義了一個Logger元件,名稱為myLogger,日誌級別為WARN。

3. 日誌級別種類:

   一共有五種,級別由高到低依次是:fatal、error、warn、info、debug。獲得Logger例項後,我們可呼叫以下方法之一輸出日誌資訊:
       public void debug(Object message);          //輸出debug級別的日誌資訊;
       public void info(Object message);           //輸出info級別的日誌資訊;
       public void warn(Object message);           //輸出warn級別的日誌資訊;
       public void error(Object message);          //輸出error級別的日誌資訊;
       public void fatal(Object message);          //輸出fatal級別的日誌資訊;
       public void log(Priority p, Object message);//輸出引數Priority指定級別的日誌資訊;
   以上方法只有當它的級別大於或等於Logger元件配置的日誌級別時才呼叫。以前面我們配置的myLogger為例,它的日誌級別為WARN, 那麼在程式中,它的warn()、error()、fatal()方法會被執行。對於log()方法,只有當它的引數Priority指定的日誌級別大於或等於WARN時,它才會被執行。

4. 為什麼需要對日誌進行分級?

   在寫程式的時候,為了除錯程式,我們會在很多出錯的地方輸出大量的日誌資訊。當程式除錯完,不需要這些資訊時,將程式中這些輸出日誌資訊程式碼刪除嗎?這樣費時費力,對於大型程式幾乎不可行。通過對日誌分級,假如不想輸出WARN級別的日誌資訊,則Logger元件的級別調高即可,省時省心。

5. Logger元件的繼承性

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

   log4j.rootLogger=INFO,console

   可在配置檔案中方便地配置存在繼承關係的Logger元件,凡是在符號“.”後面的元件都會成為在符號“.”前面的Logger元件的子類。例如:

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

   以上程式碼中, mySonLogger是myLogger的子類Logger元件。Logger元件的繼承關係:
   . 如果子類Logger元件沒有定義日誌級別,則將繼承父類的日誌級別;
   . 如果子類Logger元件定義了日誌級別,就不會繼承父類的日誌級別;
   . 黙認情況下,子類Logger元件會繼承父類所有的Appender,把它們加入到自己的Appener;
   . 如果把子類Logger元件的additivity標誌設為false,那麼它就不會繼承父類Appender。additivity標誌 預設值為false;

   以上配置的三個Logger繼承關係示例如圖:

   root Logger: 日誌級別=INFO  appender清單=console
                        ↑
   myLogger: 日誌級別=WARN appender清單=null
                        ↑
   mySonLogger: 日誌級別=null appender清單=file

   這三個Logger元件實際日誌級別和Appender如下表:

   Logger元件          日誌級別          Appender清單
   root Logger         INFO              console
   myLogger            WARN              console(繼承)
   mySonLogger         WARN(繼承)        file,console(繼承)

三、Appender元件

Appender元件決定將日誌資訊輸出到什麼地方。支援以下目的地:
. 控制檯(Console);
. 檔案(File);
. GUI元件(GUI component);
. 套介面伺服器(Remote socket server);
. NT的事件記錄器(NT Event Logger);
. UNIX Syslog守護程序(Remote UNIX Syslog daemon);

一個Logger可同時對應多個Appender,示例:myLogger配置二個Appender: 一個file, 一個是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(包含日誌資訊的級別和資訊字串);
. org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒和類別等資訊);

為名稱為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讓開發者依照ConversionPattern定義輸出格式。ConversionPattern中一些指定日誌內容和格式的預定義符號說明如下:

符號         描述
%r           自程式開始後消耗的毫秒數
%t           表示日誌記錄請求生成的執行緒
%p           表示日專語句的優先順序
%r           與日誌請求相關的類別名稱
%c           日誌資訊所在的類名
%m%n         表示日誌資訊的內容

五、Log4J的基本用法

1. 定義配置檔案
   Log4J支援二種配置檔案格式:XML和Java屬性檔案(採用“鍵=值”形式)。以下為Java屬性檔案
   格式配置檔案:

   . 配置Logger元件

     配置root Logger語法為:log4j.rootLogger=[priority],appenderName,appenderName,...
     配置自定義Logger元件語法為:log4j.logger.loggerName=[priority],appenderName,appenderName,...

     其中:priority為日誌級別,可選值包括FATAL、ERROR、WARN、INFO、DEBUG、ALL;
           appenderName指定Appender元件,可指定多個;        

   . 配置Appender元件

     配置日誌資訊輸出目的地Appender, 語法為:
     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(控制檯);
     b. org.apache.log4j.FileAppender(檔案);
     c. org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案);
     d. org.apache.log4j.RollingFileAppender(檔案大小到指定尺寸產生一個新的檔案);
     e. org.apache.log4j.WriteAppender(將日誌資訊以流格式傳送到任意指定地方);
  1. 配置Layout元件

     配置Layout元件語法為:
     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環境;

     a. BasicConfigurator.configure(): 自動快速地使用預設Log4J環境;
     b. Property.configurator.configure(String configFilename): 讀取使用Java屬性格式的配置檔案並配置Log4J環境;
     c. DOMConfigurator.configure(String filename): 讀取XML形式的配置檔案並配置LOG4J環境;
    

    . 輸出日誌資訊;

     在程式程式碼中需要生成日誌的地方,呼叫Logger的各種輸出日誌方法輸出不同級別的日誌,例如:
    
     myLogger.debug("Thie is a log message from the " + myLogger.getName());
    
     下面為一使用Log4J的程式,程式名為Test.java:
    

java 程式碼
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Test {

public static void main(String[] args) {
//Get an instance of the myLogger
Logger myLogger = Logger.getLogger(“myLogger”);

 //Get an instance of the childLogger   
 Logger mySonLogger = Logger.getLogger("myLogger.mySonLogger");   
 //Load the proerties using the PropertyConfigurator   
 PropertyConfigurator.configure("log4j.properties");   

 //Log Messages using the Parent Logger   
 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());   

}
}
程式執行結果為:

    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所在的目錄下看到一個log.txt檔案,內容如下:

    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中語句

log4j.logger.myLogger.mySonLogger=,file

改為

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

再次執行程式,結果如下:

    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的日誌在控制檯上輸出了二次,這是因為mySonLogger繼承了父類console Appender,
    本身又定義了一個console Appender, 因而有二個console Appender。

六、在web應用中使用Log4J

建立一個Servlet,在它初始化方法中讀取Log4J配置檔案並配置Log4J環境,這個Servlet在Web應用啟
動時候被載入和初始化,然後就可在其它Web元件中獲取Logger物件並輸出日誌。

1. 建立用於配置Log4J環境的Servlet

java 程式碼
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

import org.apache.log4j.PropertyConfigurator;

public class Log4JServlet extends HttpServlet {
public void init() throws ServletException {
String path = getServletContext().getRealPath(“/”);
//getInitParameter(“propfile”)方法從web.xml檔案中讀取Log4J配置檔案的名字”profile”。
String propfile = path + getInitParameter(“propfile”);
PropertyConfigurator.configure(propfile);
}
}

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

xml 程式碼

log4jServlet
Log4JServlet

propfile
/WEB-INF/log4j.properties

1

2. 在login.jsp中輸出日誌
<%@page import=”org.apache.log4j.Logger”%>


login


<%
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. 釋出執行使用Log4J的web應用
   1) 將Log4J的JAR檔案拷貝至目錄:<WEB應用所在目錄>/WEB-INF/lib
   2) 建立Log4J的配置檔案log4j.properties, 存放目錄為:<WEB應用所在目錄>/WEB-INF。內容同前面配置檔案示例。
   3) 編譯Log4JServlet, 存放至目錄: <WEB應用所在目錄>/WEB-INF/classes
   4) 修改web.xml檔案,加入以下內容:

xml 程式碼

log4jServlet
Log4JServlet

profile
/WEB-INF/log4j.properties

1

   5) 啟動伺服器,訪問login.jsp頁面,在伺服器控制檯上看到如下日誌:
      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應用所在目錄>/WEB-INF目錄下看到一個log.txt檔案,內容如下:

      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