<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    風行天下

    JAVA太極
    posts - 4, comments - 10, trackbacks - 0, articles - 55
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Apache commons簡介

    Posted on 2005-04-26 10:55 風太少 閱讀(4910) 評論(0)  編輯  收藏

    Apache Commons是一個非常有用的工具包,解決各種實際的通用問題,下面是一個簡述表,詳細信息訪問http://jakarta.apache.org/commons/index.html

    BeanUtils
    Commons-BeanUtils 提供對 Java 反射和自省API的包裝

    Betwixt
    Betwixt提供將 JavaBean 映射至 XML 文檔,以及相反映射的服務.

    Chain
    Chain 提供實現組織復雜的處理流程的“責任鏈模式”.

    CLI
    CLI 提供針對命令行參數,選項,選項組,強制選項等的簡單API.

    Codec
    Codec 包含一些通用的編碼解碼算法。包括一些語音編碼器, Hex, Base64, 以及URL encoder.

    Collections
    Commons-Collections 提供一個類包來擴展和增加標準的 Java Collection框架

    Configuration
    Commons-Configuration 工具對各種各式的配置和參考文件提供讀取幫助.

    Daemon
    一種 unix-daemon-like java 代碼的替代機制

    DBCP
    Commons-DBCP 提供數據庫連接池服務

    DbUtils
    DbUtils 是一個 JDBC helper 類庫,完成數據庫任務的簡單的資源清除代碼.

    Digester
    Commons-Digester 是一個 XML-Java對象的映射工具,用于解析 XML配置文件.

    Discovery
    Commons-Discovery 提供工具來定位資源 (包括類) ,通過使用各種模式來映射服務/引用名稱和資源名稱。.

    EL
    Commons-EL 提供在JSP2.0規范中定義的EL表達式的解釋器.

    FileUpload
    FileUpload 使得在你可以在應用和Servlet中容易的加入強大和高性能的文件上傳能力

    HttpClient
    Commons-HttpClient 提供了可以工作于HTTP協議客戶端的一個框架.

    IO
    IO 是一個 I/O 工具集

    Jelly
    Jelly是一個基于 XML 的腳本和處理引擎。 Jelly 借鑒了 JSP 定指標簽,Velocity, Cocoon和Xdoclet中的腳本引擎的許多優點。Jelly 可以用在命令行, Ant 或者 Servlet之中。

    Jexl
    Jexl是一個表達式語言,通過借鑒來自于Velocity的經驗擴展了JSTL定義的表達式語言。.

    JXPath
    Commons-JXPath 提供了使用Xpath語法操縱符合Java類命名規范的 JavaBeans的工具。也支持 maps, DOM 和其他對象模型。.

    Lang
    Commons-Lang 提供了許多許多通用的工具類集,提供了一些java.lang中類的擴展功能

    Latka
    Commons-Latka 是一個HTTP 功能測試包,用于自動化的QA,驗收和衰減測試.

    Launcher
    Launcher 組件是一個交叉平臺的Java 應用載入器。 Commons-launcher 消除了需要批處理或者Shell腳本來載入Java 類。.原始的 Java 類來自于Jakarta Tomcat 4.0 項目

    Logging
    Commons-Logging 是一個各種 logging API實現的包裹類.

    Math
    Math 是一個輕量的,自包含的數學和統計組件,解決了許多非常通用但沒有及時出現在Java標準語言中的實踐問題.

    Modeler
    Commons-Modeler 提供了建模兼容JMX規范的 Mbean的機制.

    Net
    Net 是一個網絡工具集,基于 NetComponents 代碼,包括 FTP 客戶端等等。

    Pool
    Commons-Pool 提供了通用對象池接口,一個用于創建模塊化對象池的工具包,以及通常的對象池實現.

    Primitives
    Commons-Primitives提供了一個更小,更快和更易使用的對Java基本類型的支持。當前主要是針對基本類型的 collection。.

    Validator
    The commons-validator提供了一個簡單的,可擴展的框架來在一個XML文件中定義校驗器 (校驗方法)和校驗規則。支持校驗規則的和錯誤消息的國際化。

    10:20 | 評論 (0)

    2005年3月17日

    JAR 文件就是 Java Archive File,是 Java 的文檔格式。JAR 文件非常類似 ZIP 文件——準確的說,它就是 ZIP 文件,所以叫它文件包。JAR 文件與 ZIP 文件唯一的區別就是在 JAR 文件的內容中,包含了一個 META-INF/MANIFEST.MF 文件,這個文件是在生成 JAR 文件的時候自動創建的。

    創建可運行的 JAR 文件包 
    制作一個可執行的 JAR 文件包來發布你的程序是 JAR 文件包最典型的用法。 創建可執行的 JAR 文件包,需要使用帶 cvfm 參數的 jar 命令,以 Example 目錄為例,命令如下: 

    jar cvfm Example.jar manifest.mf Example 

    這里 Example.jar 和 manifest.mf 兩個文件,分別是對應的參數 f 和 m,其重點在 manifest.mf。因為要創建可執行的 JAR 文件包,光靠指定一個 manifest.mf 文件是不夠的,因為 MANIFEST 是 JAR 文件包的特征,可執行的 JAR 文件包和不可執行的 JAR 文件包都包含 MANIFEST。關鍵在于可執行 JAR 文件包的 MANIFEST,其內容包含了 Main-Class 一項。這在 MANIFEST 中書寫格式如下: 
    Main-Class: 可執行主類全名(包含包名) 

    例如,假設 HelloWorld.class 是屬于 Examples包的,而且是可執行的類 (定義了 public static void main(String[]) 方法),那么這個 manifest.mf 可以編輯如下: 
    Main-Class: Example.HelloWorld <回車> 

    這個 manifest.mf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: test.Test 一行,且該行以一個回車符結束即可。使用 jar 命令創建 JAR 文件包之后,這個 Example.jar 就是執行的 JAR 文件包。運行時只需要使用 java -jar test.jar 命令即可。 
    需要注意的是,創建的 JAR 文件包中需要包含完整的、與 Java 程序的包結構對應的目錄結構,而 Main-Class 指定的類,也必須是完整的、包含包路徑的類名,如上例的 Example.HelloWorld。 
      

    15:43 | 評論 (0)

    2005年3月11日

    草稿中。。

    13:50 | 評論 (0)

    在現實世界中的系統經常不得不同時處理多個客戶端請求。在這樣的一個典型的多線程的系統中,不同的線程將處理不同的客戶端。一個常見的區分每個客戶端所輸出的Logging的方法是為每個客戶端實例化一個新的獨立的Logger。這導致Logger的大量產生,管理的成本也超過了logging本身。
     
    嵌套診斷環境NDC 
    在多用戶并發的環境下,通常是由不同的線程分別處理不同的客戶端請求。此時要在日志信息中區分出不同的客戶端,區分兩個客戶的日志輸出的常用方法是單獨為每個客戶端實例化新類別。但是,該方法會增加類別數量,并增加日志記錄的管理開銷。

    Log4J巧妙地使用了Neil Harrison提出的“NDC(嵌套診斷環境)”機制來解決這個問題。Neil Harrison(請參閱參考資料)想出了一個簡便方法,可以唯一標記從同一個客戶機交互啟動的每一個日志記錄請求。Log4J為同一類別的線程生成一個Logger,多個線程共享使用,而它僅在日志信息中添加能夠區分不同線程的信息,該信息可能是發出請求的主機名、IP地址或其它任何可以用于標識該請求的信息。這樣,由于不同的客戶端處理線程具有不同的NDC堆棧,即使這個Servlet同時生成多個線程處理不同的請求,這些日志信息仍然可以區分出來,就好像Log4J為每一個線程都單獨生成了一個Logger實例一樣。

    在Log4J中是通過org.apache.log4j.NDC實現這種機制的。使用NDC的方法也很簡單,步驟如下: 
    1. 在進入一個環境時調用NDC.push(String),然后創建一個NDC; 
    2. 所做的日志操作輸出中包括了NDC的信息; 
    3. 離開該環境時調用NDC.pop方法; 
    4. 當從一個線程中退出時調用NDC.remove方法,以便釋放資源。 

    下面是一個模擬記錄來自不同客戶端請求事件的例子,代碼如下: 

    import org.apache.log4j.Logger;
    import org.apache.log4j.NDC;
    public class TestNDC {
     static Logger log = Logger.getLogger(TestNDC.class.getName());
     public static void main(String[] args) {
      log.info("Make sure %x is in your layout pattern!");
      // 從客戶端獲得IP地址的例子
      String[] ips = {"192.168.0.10","192.168.0.27"};
      for (int i = 0; i  {
       // 將IP放進 NDC中
       NDC.push(ips[i]);
       log.info("A NEW client connected, who's ip should appear in this log message.");
       NDC.pop();
      }
      NDC.remove();
      log.info("Finished.");
     }
    }


    注意配置文件中的布局格式中一定要加上%x。系統輸出如下: 
    INFO   - Make sure %x is in your layout pattern!
    INFO  192.168.0.10 - A NEW client connected, who's ip should appear in this log 
    message.
    INFO  192.168.0.27 - A NEW client connected, who's ip should appear in this log 
    message.
    INFO   - Finished.

    在Web應用中使用 
    在Web應用中,應該在哪兒對Log4J進行配置呢?首先要明確,Log4J必須在應用的其它代碼執行前完成初始化。因為Servlet是在Web服務器啟動時立即裝入的,所以,在Web應用中一般使用一個專門的Servlet來完成Log4J的配置,并保證在web.xml的配置中,這個Servlet位于其它Servlet之前。下面是一個例子,代碼如下: 

    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參數讀取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 {}
    }


      log4jinit 
       org.javaresearch. log4j.Log4JInit        
       
        log4j-config-file  
       /properties/log4j.properties 
       

       1
      


    注意:上面的load-on-startup應設為1,以便在Web容器啟動時即裝入該Servlet。log4j.properties文件放在根的properties子目錄中,也可以把它放在其它目錄中。應該把.properties文件集中存放,這樣方便管理。 

    Use log4j in J2EE

        在J2EE 服務器中使用log4j包需要注意的是:1)基于J2EE服務器jar包加載機制的特殊性,必須將log4j的jar包拷貝到%JAVAHOME\jre\lib\ext\目錄下。僅僅放到CLASSPATH中是不起作用的。2)因為J2EE服務器對文件操作進行了嚴格的控制,所以Log文件時只能寫到%J2EE_HOME%\logs目錄下,除非修改server.policy文件指定別的可寫目錄。下面我舉這個很簡單的例子說明一下如何在J2EE服務器中使用上log4j開發工具包,例子中涉及的文件如下:

    bonus.html



    Bonus Calculation


    ACTION="BonusAlias">


    Enter social security Number:




    Enter Multiplier:











    上面的bonus.html接受用戶輸入的社會保險號和投保金額。
    BonusServlet.java
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import javax.naming.*;
    import javax.rmi.PortableRemoteObject;
    import Beans.*;
    public class BonusServlet extends HttpServlet {
    CalcHome homecalc;
    public void init(ServletConfig config)
    throws ServletException{
    //Look up home interface
    try{
    InitialContext ctx = new InitialContext();
    Object objref = ctx.lookup("calcs");
    homecalc =(CalcHome)PortableRemoteObject.narrow(
    objref,CalcHome.class);
    } catch (Exception NamingException) {
    NamingException.printStackTrace();
    }
    }
    public void doGet (HttpServletRequest request,HttpServletResponse response)
    throws ServletException, IOException {
    String socsec = null;
    int multiplier = 0;
    double calc = 0.0;
    PrintWriter out;
    response.setContentType("text/html");
    String title = "EJB Example";
    out = response.getWriter();
    out.println("");
    try{
    Calc theCalculation;
    //Get Multiplier and Social Security Information
    String strMult = request.getParameter("MULTIPLIER");
    Integer integerMult = new Integer(strMult);
    multiplier = integerMult.intValue();
    socsec = request.getParameter("SOCSEC");
    //Calculate bonus
    double bonus = 100.00;
    theCalculation = homecalc.create();
    calc = theCalculation.calcBonus(multiplier, bonus);
    } catch(Exception CreateException){
    CreateException.printStackTrace();
    }
    //Display Data
    out.println("

    Bonus Calculation

    ");
    out.println("

    Soc Sec: " + socsec + "

    ");
    out.println("

    Multiplier: " + multiplier + "

    ");
    out.println("

    Bonus Amount: " + calc + "

    ");
    out.println("");
    out.close();
    }
    public void destroy() {
    System.out.println("Destroy");
    }
    }


    BonusServlert.java得到從bonus.html中傳過來的社會保險號和金額,并調用EJB程序對數據進行處理并將結果顯示給客戶端。

    EJB 的Home接口:

    package Beans;
    import java.rmi.RemoteException;
    import javax.ejb.CreateException;
    import javax.ejb.EJBHome;
    public interface CalcHome extends EJBHome {
    Calc create() throws CreateException,RemoteException;
    }

    EJB 的Remote 接口:
    package Beans;
    import javax.ejb.EJBObject;
    import java.rmi.RemoteException;
    public interface Calc extends EJBObject {
    public double calcBonus(int multiplier,double bonus)
    throws RemoteException;
    }

    EJB 的業務處理邏輯:
    package Beans;
    import java.rmi.RemoteException;
    import javax.ejb.SessionBean;
    import javax.ejb.SessionContext;
    public class CalcBean implements SessionBean {
    public double calcBonus(int multiplier,double bonus) {
    double calc = (multiplier*bonus);
    return calc;
    }
    //These methods are described in more
    //detail in Lesson 2
    public void ejbCreate() { }
    public void setSessionContext(
    SessionContext ctx) { }
    public void ejbRemove() { }
    public void ejbActivate() { }
    public void ejbPassivate() { }
    public void ejbLoad() { }
    public void ejbStore() { }
    }

        成功發布后就可以在代碼中加入Log4j的測試代碼了。想詳細了解上面的應用程序的發布步驟請叁照我最近寫的一篇文章“Say ‘Hello World’ to EJB”。接下來我們在EJB中使用Log4j包(由于Servlet 中使用Log4j的方法和前面提到的例子中的使用方法相同,這里不在重復)。
    1. 首先在EJB的Remote接口中增加名為logtest的方法聲明:
    package Beans;
    import javax.ejb.EJBObject;
    import java.rmi.RemoteException;
    public interface Calc extends EJBObject {
    public double calcBonus(int multiplier,double bonus)
    throws RemoteException;
    public void logtest() throws RemoteException;
    }

    2.在 EJB的業務處理Bean中實現logtest()方法:
    package Beans;
    import java.rmi.RemoteException;
    import javax.ejb.SessionBean;
    import javax.ejb.SessionContext;
    import org.apache.log4j.Category;
    import org.apache.log4j.Logger;
    import org.apache.log4j.*;
    import org.apache.log4j.NDC;

    public class CalcBean implements SessionBean {
    static Logger logger = Logger.getLogger(CalcBean.class.getName());
    public double calcBonus(int multiplier,double bonus) {
    logger.debug("Entering calcBeans() method"); 
    logtest();
    double calc = (multiplier*bonus);
    logger.debug("Exitint calcBeans() method");
    return calc;
    }
    public void logtest(){
    logger.debug("Enter logtest method");
    NDC.push("Client #45890"); 
    logger.debug("Exiting logtest method.");
    }
    //These methods are described in more
    //detail in Lesson 2
    public void ejbCreate() { 
    PropertyConfigurator.configure("F:/example.properties"); 
    }
    public void setSessionContext(
    SessionContext ctx) { }
    public void ejbRemove() { }
    public void ejbActivate() { }
    public void ejbPassivate() { }
    public void ejbLoad() { }
    public void ejbStore() { }
    }


    這里假設log配置文件為F:盤下的example.properties文件。
    接下來就是配置文件的設置問題了。
    Example.properties
    # Attach appender A1 to root. Set root level to Level.DEBUG.
    log4j.rootLogger=DEBUG, A1

    # A1 is set to be a FileAppender sending its output to
    # a log file. However, only error messages and above will be printed
    # in A1 because A1's threshold is set to Level.ERROR.

    # The fact that the root level is set to Prority.DEBUG only influences
    # log requests made to the root logger. It has no influence on the
    # *appenders* attached to root.
    # Appender A1 writes to the file "test" in J2EE's allow write DIR ex logs direstory.
    log4j.appender.A1=org.apache.log4j.FileAppender
    log4j.appender.A1.File=E:/j2sdkee1.3/logs/test.log

    # Truncate 'test' if it aleady exists.
    log4j.appender.A1.Append=false

    # Appender A1 uses the PatternLayout.
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%5r %-5p [%t] %c{2} - %m%n
    # Set the level of the logger named "Beans.CalcBean" to 
    # Level.DEBUG(also INFO WARN ERROR etc.),auto attach appender A1.
    log4j.category.Beans.CalcBean=debug


    這樣重新發布這個EJB就回在%J2EE_HOME%\logs 目錄下生成名為test.log的log文件。

    13:48 | 評論 (0)

    2005年3月1日

    背景
    對于有經驗的開發者來說,日志記錄的重要性顯而易見。例如程序中的異常處理和安全性都依賴于Logging的功能來幫助履行它們的指責。應用程序中的日志記錄主要基于三個目的:監視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統計分析工作;跟蹤代碼運行時軌跡,作為日后審計的依據;擔當集成開發環境中的調試器的作用,向文件或控制臺打印代碼的調試信息。經驗表明日志記錄是開發周期中的重要組成部分。

    最簡單的做法就是在代碼中嵌入許多的打印語句,但是這樣打印語句會充斥代碼的主體,顯然不是一個好方法。因此,使用成熟的框架例如Log4j,則會更具靈活性。

    Log4j簡介
    Log4j 框架是用 Java 語言編寫的標準日志記錄框架。作為 Jakarta 項目的一部分,它在 Apache 軟件許可證(Apache Software License)下分發,以速度和靈活性為中心概念:Log4j 環境是完全可配置的,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。

    Log4j由三個重要的部件構成:記錄器(Loggers)、輸出源(Appenders)和布局(Layouts)。

    記錄器按照布局中指定的格式把日志信息寫入一個或多個輸出源。輸出源可以是控制臺、文本文件、XML文件或Socket,甚至還可以把信息寫入到Windows事件日志或通過電子郵件發送。我們可以通過配置文件來部署這些組件。

    其實您也可以完全不使用配置文件,而是在代碼中配置Log4j環境。但是,使用配置文件將使您的應用程序更加靈活。本文從描述 log4j 體系結構的主要組件著手。然后是描述基本用法和配置的簡單示例。

    定義配置文件
    Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。下面我們介紹使用Java特性文件做為配置文件的方法:

    一、 配置記錄器。

    Log4j允許程序員定義多個記錄器,每個記錄器有自己的名字。但有一個記錄器叫根記錄器,它永遠存在,且不能通過名字檢索或引用,在配置文件中,可以如下定義根記錄器:

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

    Level是記錄器的級別,它是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別:ERROR、WARN、INFO、DEBUG:

      DEBUG  <  INFO  <  WARN  <  ERROR  <  FATAL

    右邊的級別比左邊的高。如果一條log信息的級別,大于等于記錄器的級別值,那么記錄器就會記錄它。例如level被設置為INFO級別,那么應用程序中所有的DEBUG的日志信息將不被打印出來。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。

     appenderName是輸出源的名字,它指定日志信息輸出到哪個地方。您可以為一個記錄器指定多個輸出源。

    在一些配置文件中,你可能會看到下面的語句:

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

    在早期的Log4j版本中,org.apache.Category實現了記錄器的功能,為了提高向后兼容性,Logger擴展了Category,因此rootCategory和rootLogger是可以互換的,但最后Category將從類庫中刪除,因此請使用Logger類。

    除了根記錄器之外,log4j允許程序員定義多個記錄器,每個記錄器有自己的名字:

      log4j.logger.loggerName = [ level ] , appenderName, appenderName, … 

    在Log4J中Logger是具有層次關系的,Log4j支持配置的記錄器之間的“父子關系”,記錄器之間通過名字來表明隸屬關系(或家族關系),它們有一個共同的根,位于最上層,其它Logger遵循類似包的層次:記錄器a.b,與記錄器a.b.c之間是父子關系,而記錄器a與a.b.c之間是祖先與后代的關系。例如:

        static Logger root = Logger.getRootLogger();
           static Logger log1 = Logger.getLogger("cc");
           static Logger log2 = Logger.getLogger("cc.ejb");
           static Logger log3 = Logger.getLogger("cc.ejb.my.TestApp");
     
    上面代碼中,log1是log2的父親,是log3的祖先,而root是所有log1、log2、log3的祖先,它們都從root中繼承。所以,一般情況下,僅需要配置好rootLogger,其它子記錄器都會從中繼承rootLogger的配置。如果修改了rootLogger的配置,其它所有的子記錄器也會繼承這種變化。這樣就大大地方便了配置。
     
    如果一個應用中包含了上千個類都需要日志,那么我們是否需要配置上千個Logger呢?我們通過一個簡單的辦法來解決這個問題: 用每一個java類文件名(包含該類的包名)定義一個記錄器,這是一種有用并且直觀的記錄器實例名的定義方式。例如在配置文件中定義了一個com.foo的記錄器:
      log4j.logger.com.foo=WARN
    在com.foo中的一個java類bar,我們通過其本類的名字獲得一個記錄器“com.foo.Bar”:

    package com.foo;
    class Bar{
    static Logger log=Logger.getLogger(bar.Class.getName());
    .....
    }

    由于記錄器com.foo.Bar 沒有指定的級別,它從com.foo(在配置文件中其級別設置成WARN) 繼承級別。并且這樣我們就能方便的從大量log信息中判斷出它們各自的來源。當然了,這不是硬性規定的,實際上Log4j沒有對設置記錄器的實例名做什么限制,程序員可以根據自己的喜好隨意定義。

    二、日志信息輸出源Appender
    log4j 還允許日志記錄請求打印到多個輸出目的地,按 log4j 的叫法是輸出源。一個記錄器可以有多個輸出源。一條log信息如果可被這個記錄器處理,則該記錄器會把這條信息送往每個它所擁有的輸出源,以及層次結構中更高級的輸出源。例如,根記錄器以控制臺作為輸出源,則所有可被紀錄的日志都將至少打印到控制臺。

    配置日志信息輸出源,其語法為:

      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(控制臺)
    • org.apache.log4j.FileAppender(文件) 
    • org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
    • org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件) 
    • org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方) 
    • org.apache.log4j.SocketAppender (Socket)
    • org.apache.log4j.NtEventLogAppender   (NT的Event Log) 
    • org.apache.log4j.JMSAppender   (電子郵件)

    請注意,可以通過覆蓋缺省行為,這樣就不再附加累積的輸出源:

      log4j.additivity.loggerName=false

    注意,不要把一個輸出源附加到多個記錄器上,否則會得到“Attempted to append to closed appender named xxx”的信息。


    三、配置日志信息的格式(布局),其語法為:

      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(包含日志信息的級別和信息字符串)
    • org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

    如果采用了PatternLayout, 則Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下:

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

    四、例子
    下面是一個完整的Log4j配置文件,這個配置文件指定了兩個輸出源stdout和R。前者把日志信息輸出到控制臺,后者是一個輪轉日志文件。最大的文件是100KB,當一個日志文件達到最大尺寸時,Log4J會自動把example.log重命名為example.log.1,然后重建一個新的example.log文件,依次輪轉。

    log4j.rootLogger=debug, stdout, R

    log4j.appender.stdout=org.apache.log4j.FileAppender
    log4j.appender.stdout.File=System.out
    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

    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=example.log

    log4j.appender.R.MaxFileSize=100KB
    # Keep one backup file
    log4j.appender.R.MaxBackupIndex=1

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

    log4j.logger.cc.ejb.my=error,out

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

    log4j.logger.cc.ejb.my.son=debug
    log4j.additivity.cc.ejb.my.son=false

    在代碼中使用Log4j 

    一、得到記錄器
    使用Log4j,第一步就是獲取日志記錄器,這個記錄器將負責控制日志信息。其語法為: 

      public static Logger getLogger( String name) 

    通過指定的名字獲得記錄器,如果必要的話,則為這個名字創建一個新的記錄器。Name一般取本類的名字,比如: 

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

    二、讀取配置文件 
    當獲得了日志記錄器之后,第二步將配置Log4j環境,其語法為:

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

    三、插入記錄信息(格式化日志信息)
    當上兩個必要步驟執行完畢,您就可以輕松地使用不同優先級別的日志記錄語句插入到您想記錄日志的任何地方,其語法如下:

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

    四、例子

    我們通過下面這個簡單的例子,來演示在程序如何使用Log4j,您可以修改配置文件以得到不同日志信息。

    package cc.ejb.my;
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    import my.son.Foo;
    public class TestApp {

        static Logger logger=Logger.getLogger(TestApp.class.getName());

        public static void main(String[] args) {
           
            PropertyConfigurator.configure("log4j.properties");
            logger.info("Applcaiton Starts");
            logger.warn("Bar Starts");
            Bar bar=new Bar();
            logger.error("Bar Errors");
            bar.doIt();
            logger.warn("Bar  Exits");
            logger.info("Foo Starts");
            Foo foo=new Foo();
            logger.error("Foo Errors");
            foo.doit();
            logger.warn("Foo exits ");
            logger.info("Applcaition Exits");
           
        }

    }

    class Bar
    {
        static Logger logger = Logger.getLogger(Bar.class.getName());
        public void doIt() {
          logger.debug("Did it again!");
        }
      }

    package cc.ejb.my.son;

    import org.apache.log4j.Logger;

    public class Foo {
        private Logger log=Logger.getLogger(Foo.class.getName());
        public Foo() {
            log.info("Foo Initialzie");
        }
        public void doit()
        {
            log.debug("Do it in Foo");
        }

    }


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品成人区在线观看| 亚洲黄色免费网址| 成全动漫视频在线观看免费高清版下载| 亚洲乱码国产乱码精品精| 1000部拍拍拍18免费网站| 日韩成人精品日本亚洲| 亚洲一区二区女搞男| 91手机看片国产永久免费| 免费在线观看一区| 亚洲视频免费一区| 亚洲A∨精品一区二区三区| 日本免费人成视频在线观看| 亚洲av无码有乱码在线观看| 久久国产精品亚洲综合| 日本不卡视频免费| 99re在线这里只有精品免费| 综合偷自拍亚洲乱中文字幕| 亚洲丁香色婷婷综合欲色啪| 免费国产在线观看| 91网站免费观看| 波多野结衣免费一区视频| 国产精品亚洲精品爽爽| 亚洲国产精品久久久久久| 四只虎免费永久观看| 无码av免费毛片一区二区| 99在线免费观看| 亚洲av成本人无码网站| 亚洲国产精品线观看不卡| 亚洲精品亚洲人成在线观看| 国产精品无码一区二区三区免费| 69视频免费在线观看| 国产A∨免费精品视频| 久久久久亚洲国产AV麻豆| 亚洲成在人线电影天堂色| 亚洲AV综合色区无码一区| 国产一区二区三区在线免费观看 | 免费观看激色视频网站bd| 一级一级毛片免费播放| 国产精品无码亚洲精品2021| 亚洲人成免费电影| 亚洲第一网站免费视频|