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

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

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

    【永恒的瞬間】
    ?Give me hapy ?
    4. 配置

    插入日志請(qǐng)求到應(yīng)用程序的代碼中需要大量的預(yù)先計(jì)劃和最終努力。觀察顯示大約4%的代碼是用來(lái)輸出的。

    因此,大小適度的程序都被嵌入有成千個(gè)日志輸出語(yǔ)句。為了以無(wú)需手工的方式管理這些日志的輸出狀態(tài),給日志輸出以編號(hào)和規(guī)范變得勢(shì)在必行。

    Log4j在程序中有充分的可配置性。然而,用配置文件配置Log4j具有更大的彈性。目前,它的配置文件支持xml和java properties(key=value)文件兩種格式。

    讓我們以一個(gè)例子來(lái)演示它是如何做的。假定有一個(gè)用了Log4j的程序MyApp。


    import com.foo.Bar;

    // Import Log4j classes.

    import org.apache.Log4j.Logger;

    import org.apache.Log4j.BasicConfigurator;

    public class MyApp {

    // Define a static logger variable so that it references the

    // Logger instance named "MyApp".

    static Logger logger = Logger.getLogger(MyApp.class);

    public static void main(String[] args) {

    // Set up a simple configuration that logs on the console.

    BasicConfigurator.configure();

    logger.info("Entering application.");

    Bar bar = new Bar();

    bar.doIt();

    logger.info("Exiting application.");

    }

    }

    MyApp以引入Log4j的相關(guān)類(lèi)開(kāi)始,接著它定義了一個(gè)靜態(tài)logger變量,并給予值為"MyApp"類(lèi)的全路徑名稱(chēng)。

    MYApp用了定義在包c(diǎn)om.foo中的類(lèi)Bar.

    package com.foo;

    import org.apache.Log4j.Logger;

    public class Bar {

    static Logger logger = Logger.getLogger(Bar.class);

    public void doIt() {

    logger.debug("Did it again!");

    }

    }

    調(diào)用BasicConfigurator.configure()方法創(chuàng)建了一個(gè)相當(dāng)簡(jiǎn)單的Log4j的設(shè)置。它加入一

    個(gè)ConsoleAppender到根logger。輸出將被采用了"%-4r [%t] %-5p %c %x - %m%n"模式

    的PatternLayout所格式化。

    注意,根logger默認(rèn)被分配了Level.DEBUG的級(jí)別。

    MyApp的輸出為:

    0 [main] INFO MyApp - Entering application.

    36 [main] DEBUG com.foo.Bar - Did it again!

    51 [main] INFO MyApp - Exiting application.

    隨后的圖形描述了在調(diào)用BasicConfigurator.configure()方法后MyApp的對(duì)象圖。





    一邊要提醒的是,Log4j的子logger只連接到已經(jīng)存在的它們的父代。特別的是,名為

    com.foo.bar的logger是直接連接到根logger,而不是圍繞著沒(méi)用的com或com.foo

    logger。這顯著的提高了程序性能并且減少的內(nèi)存占用。

    MyApp類(lèi)配置Log4j是通過(guò)調(diào)用BasicConfigurator.configure 方法。其它的類(lèi)僅僅

    需要引入org.apache.Log4j.Logger 類(lèi),找到它們希望用的logger,并且用它就行。

    以前的例子通常輸出同樣的日志信息。幸運(yùn)的是,修改MyApp是容易的,以便日志輸

    出可以在運(yùn)行時(shí)刻被控制。這里是一個(gè)小小修改的版本。



    import com.foo.Bar;

    import org.apache.Log4j.Logger;

    import org.apache.Log4j.PropertyConfigurator;

    public class MyApp {

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

    public static void main(String[] args) {

    // BasicConfigurator replaced with PropertyConfigurator.

    PropertyConfigurator.configure(args[0]);

    logger.info("Entering application.");

    Bar bar = new Bar();

    bar.doIt();

    logger.info("Exiting application.");

    }

    }

    修改后的 MyApp通知程序調(diào)用PropertyConfigurator()方法解析一個(gè)配置文件,并且根

    據(jù)這個(gè)配置文件來(lái)設(shè)置日志。

    這里是一個(gè)配置文件的例子,它將產(chǎn)生同以前BasicConfigurator 基本例子一樣

    的輸出結(jié)果。

    # Set root logger level to DEBUG and its only appender to A1.

    Log4j.rootLogger=DEBUG, A1

    # A1 is set to be a ConsoleAppender.

    Log4j.appender.A1=org.apache.Log4j.ConsoleAppender

    # A1 uses PatternLayout.

    Log4j.appender.A1.layout=org.apache.Log4j.PatternLayout

    Log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

    假設(shè)我們不在對(duì)com.foo包的任何類(lèi)的輸出感興趣的話,隨后的配置文件向我們展示

    了實(shí)現(xiàn)這個(gè)目的的方法之一。

    Log4j.rootLogger=DEBUG, A1

    Log4j.appender.A1=org.apache.Log4j.ConsoleAppender

    Log4j.appender.A1.layout=org.apache.Log4j.PatternLayout

    # Print the date in ISO 8601 format

    Log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

    # Print only messages of level WARN or above in the package com.foo.

    Log4j.logger.com.foo=WARN

    以這個(gè)配置文件配置好的MyApp將輸出如下:

    2000-09-07 14:07:41,508 [main] INFO MyApp - Entering application.

    2000-09-07 14:07:41,529 [main] INFO MyApp - Exiting application.

    當(dāng)logger com.foo.bar沒(méi)有被分配一個(gè)級(jí)別,它將從com.foo繼承,在配置文件中

    它被設(shè)置了WARN的級(jí)別。在Bar.doIt方法中定義的log為DEBUG級(jí)別,低于WARN,

    因此doIt() 方法的日志請(qǐng)求被禁用。

    這里是另外一個(gè)配置文件,它使用了多個(gè)appenders.

    Log4j.rootLogger=debug, stdout, R

    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

    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

    以這個(gè)配置文件調(diào)用加強(qiáng)了的MyApp類(lèi)將輸出如下信息.

    INFO [main] (MyApp2.java:12) - Entering application.

    DEBUG [main] (Bar.java:8) - Doing it again!

    INFO [main] (MyApp2.java:15) - Exiting application.

    另外,因?yàn)楦鵯ogger有被分配第二個(gè)appender,所以輸出也將被定向到example.log文件。

    這個(gè)文件大小達(dá)到100kb時(shí)將自動(dòng)備份。備份時(shí)老版本的example.log文件自動(dòng)被移到

    文件example.log.1中。

    注意我們不需要重新編譯代碼就可以獲得這些不同的日志行為。我們一樣可以容易

    的使日志輸出到UNIX Syslog daemon, 重定向所有的com.foo到NT Event logger,

    或者轉(zhuǎn)發(fā)日志到一個(gè)遠(yuǎn)程的Log4j服務(wù)器,它根據(jù)本地server的策略來(lái)進(jìn)行日志輸出。例

    如轉(zhuǎn)發(fā)日志事件到第二個(gè)Log4j服務(wù)器.



    5. 默認(rèn)的初始化過(guò)程
    Log4j類(lèi)庫(kù)不對(duì)它的環(huán)境做任何假設(shè)。特別是沒(méi)有默認(rèn)的Log4j appender。在一些特別

    的有著良好定義的環(huán)境下,logger的靜態(tài)inializer將嘗試自動(dòng)的配置Log4j。

    java語(yǔ)言的特性保證類(lèi)的靜態(tài)initializer當(dāng)且僅當(dāng)裝載類(lèi)到內(nèi)存之時(shí)只會(huì)被調(diào)用一次。

    要記住的重要一點(diǎn)是,不同的類(lèi)裝載器可能裝載同一個(gè)類(lèi)的完全不同的拷貝。

    這些同樣類(lèi)的拷貝被虛擬機(jī)認(rèn)為是完全不相干的。

    默認(rèn)的initialization是非常有用的,特別是在一些應(yīng)用程序所依靠的運(yùn)行環(huán)境被準(zhǔn)確的

    定位的情況下。例如,同一樣的應(yīng)用程序可以被用做一個(gè)標(biāo)準(zhǔn)的應(yīng)用程序,或一個(gè)

    applet,或一個(gè)在web-server控制下的servlet。

    準(zhǔn)確的默認(rèn)的initialization原理被定義如下:

    1.設(shè)置系統(tǒng)屬性Log4j.defaultInitOverride為"false"以外的其它值,那么Log4j將

    跳過(guò)默認(rèn)的initialization過(guò)程。

    2.設(shè)置資源變量字符串給系統(tǒng)屬性Log4j.configuration。定義默認(rèn)initialization

    文件的最好的方法是通過(guò)系統(tǒng)屬性Log4j.configuration。萬(wàn)一系統(tǒng)屬性

    Log4j.configuration沒(méi)有被定義,那么設(shè)置字符串變量resource 給它的默認(rèn)值

    Log4j.properties。

    3.嘗試轉(zhuǎn)換resource 變量為一個(gè)URL。

    4.如果變量resource的值不能被轉(zhuǎn)換為一個(gè)URL,例如由于MalformedURLException違

    例,那么通過(guò)調(diào)用

    org.apache.Log4j.helpers.Loader.getResource(resource, Logger.class) 方法從

    classpath中搜索resource,它將返回一個(gè)URL,并通知"Log4j.properties"的值是一個(gè)錯(cuò)

    誤的URL。

    看See Loader.getResource(java.lang.String) 查看搜索位置的列表。

    5.如果沒(méi)有URL被發(fā)現(xiàn),那么放棄默認(rèn)的initialization。否則用URL配置Log4j。

    PropertyConfigurator將用來(lái)解析URL,配置Log4j,除非URL以".xml"為結(jié)尾。

    在這種情況下的話DOMConfigurator將被調(diào)用。你可以有機(jī)會(huì)定義一個(gè)自定義的

    configurator。

    系統(tǒng)屬性Log4j.configuratorClass 的值取自你的自定義的類(lèi)名的全路徑。

    你自定義的configurator必須實(shí)現(xiàn)configurator接口。



    6. 配置范例
    6.1 Tomcat下的初始化
    默認(rèn)的Log4j initialization典型的應(yīng)用是在web-server 環(huán)境下。在tomcat3.x和tomcat4.x

    下,你應(yīng)該將配置文件Log4j.properties放在你的web應(yīng)用程序的WEB-INF/classes 目錄

    下。

    Log4j將發(fā)現(xiàn)屬性文件,并且以此初始化。這是使它工作的最容易的方法。

    你也可以選擇在運(yùn)行tomcat前設(shè)置系統(tǒng)屬性Log4j.configuration 。對(duì)于tomcat 3.x,

    TOMCAT_OPTS 系統(tǒng)變量是用來(lái)設(shè)置命令行的選項(xiàng)。對(duì)于tomcat4.0,用系統(tǒng)環(huán)境變

    量CATALINA_OPTS 代替了TOMCAT_OPTS。

    Example 1

    UNIX 命令行

    export TOMCAT_OPTS="-DLog4j.configuration=foobar.txt"

    告訴Log4j用文件foobar.txt作為默認(rèn)的配置文件。這個(gè)文件應(yīng)該放在WEB-INF/classes

    目錄下。這個(gè)文件將被PropertyConfigurator所讀。每個(gè)web-application將用不同的默認(rèn)

    配置文件,因?yàn)槊總€(gè)文件是和它的web-application 相關(guān)的。

    Example 2

    UNIX 命令行

    export TOMCAT_OPTS="-DLog4j.debug -DLog4j.configuration=foobar.xml"

    告訴Log4j輸出Log4j-internal的調(diào)試信息,并且用foobar.xml作為默認(rèn)的配置文件。

    這個(gè)文件應(yīng)該放在你的web-application的WEB-INF/classes 目錄下。因?yàn)橛?xml的

    擴(kuò)展名,它將被DOMConfigurator所讀。每個(gè)web-application將用不同的默認(rèn)

    配置文件。因?yàn)槊總€(gè)文件都和它所在的web-application 相關(guān)的。

    Example 3

    UNIX 命令行

    set TOMCAT_OPTS=-DLog4j.configuration=foobar.lcf -DLog4j.configuratorClass=com.foo.BarConfigurator

    告訴Log4j用文件foobar.lcf作為默認(rèn)的配置文件。這個(gè)文件應(yīng)該放在你的

    web-application的WEB-INF/classes 目錄下。因?yàn)槎x了Log4j.configuratorClass 系統(tǒng)屬

    性,文件將用自定義的com.foo.barconfigurator類(lèi)來(lái)解析。每個(gè)web-application將用不

    同的默認(rèn)配置文件。因?yàn)槊總€(gè)文件都和它所在的web-application 相關(guān)的。

    Example 4

    UNIX 命令行

    set TOMCAT_OPTS=-DLog4j.configuration=file:/c:/foobar.lcf

    告訴Log4j用文件foobar.lcf作為默認(rèn)的配置文件。這個(gè)配置文件用URL file:/c:/foobar.lcf

    定義了全路徑名。這樣同樣的配置文件將被所有的web-application所用。

    不同的web-application將通過(guò)它們自己的類(lèi)裝載器來(lái)裝載Log4j。這樣,每個(gè)Log4j的環(huán)

    境將獨(dú)立的運(yùn)作,而沒(méi)有任何的相互同步。例如:在多個(gè)web-application中定義了

    完全相同的輸出源的FileAppenders將嘗試寫(xiě)同樣的文件。結(jié)果好象是缺乏安全性的。

    你必須確保每個(gè)不同的web-application的Log4j配置沒(méi)有用到同樣的系統(tǒng)資源。



    6.2 Servlet 的初始化
    用一個(gè)特別的servlet來(lái)做Log4j的初始化也是可以的。如下是一個(gè)例子:

    package com.foo;

    import org.apache.Log4j.PropertyConfigurator;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import java.io.PrintWriter;

    import java.io.IOException;

    public class Log4jInit extends HttpServlet {

    public void init() {

    String prefix = getServletContext().getRealPath("/");

    String file = getInitParameter("Log4j-init-file");

    // if the Log4j-init-file is not set, then no point in trying

    if(file != null) {

    PropertyConfigurator.configure(prefix+file);

    }

    }

    public void doGet(HttpServletRequest req, HttpServletResponse res) {

    }

    }

    在web.xml中定義隨后的servlet為你的web-application。



    Log4j-init

    com.foo.Log4jInit



    Log4j-init-file

    WEB-INF/classes/Log4j.lcf



    1



    寫(xiě)一個(gè)初始化的servlet是最有彈性的初始化Log4j的方法。代碼中沒(méi)有任何限制,你可

    以在servlet的init方法中定義它。



    posted on 2007-01-03 17:03 ???MengChuChen 閱讀(346) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Log4j
    主站蜘蛛池模板: 深夜福利在线免费观看| 亚洲精华国产精华精华液| www.黄色免费网站| 老司机午夜在线视频免费观| 亚洲色婷婷综合久久| 0588影视手机免费看片| 曰批全过程免费视频观看免费软件| 亚洲国产三级在线观看| 处破痛哭A√18成年片免费| 国产精品偷伦视频免费观看了| 亚洲精品视频久久| 无码欧精品亚洲日韩一区夜夜嗨 | 成人性生交大片免费看好| 激情综合亚洲色婷婷五月| 亚洲精品乱码久久久久久蜜桃| **真实毛片免费观看| 人妻仑刮八A级毛片免费看| 亚洲午夜精品在线| 337p日本欧洲亚洲大胆裸体艺术| 日本在线高清免费爱做网站| 黄色网页在线免费观看| 亚洲中文字幕无码中文| 亚洲日本精品一区二区| 亚洲日本一区二区三区在线不卡| 很黄很黄的网站免费的| 国产无遮挡无码视频免费软件| 亚洲AV成人无码网天堂| 亚洲大香人伊一本线| 国产精品亚洲精品日韩已满| 国产一级高清免费观看| 亚洲日产2021三区| 亚洲色精品vr一区二区三区| 国产精品无码免费视频二三区| 最近中文字幕mv免费高清视频8 | 99爱视频99爱在线观看免费| 一级特级女人18毛片免费视频| 亚洲中文字幕无码av| 亚洲成人网在线播放| 婷婷精品国产亚洲AV麻豆不片| 久久久久噜噜噜亚洲熟女综合| 日本一道一区二区免费看 |