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

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

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

    【永恒的瞬間】
    ?Give me hapy ?
    Log4j簡明手冊

    1. 概述
    本文主要描述Log4j的API的唯一特性和它的設計原理。Log4j是一個基于許多作者的開放源碼的項目。它允許開發員以任意的間隔來控制日志的輸出。它通過設在外部的配置文件而達到運行時靈活的設置。最重要的是,Log4j有一個平穩的學習曲線。注意:根據來自用戶的反饋判斷,它很容易使人上癮。

    2. 導言

    幾乎所有的大型應用程序都包括它的自己的日志和跟蹤API。順應這個規則,E.U. SEMPER 項目決定寫它自己的跟蹤PAI。這是1996年初。在無數次加強,幾次變形和許多工作后,那個API變成了如今的Log4j,一個流行的java日志包。這個包以Apache Software License協議發布,一個成熟的開放源嗎協議。最新的Log4j版本,包括全部的源碼,class文件和文檔,你可以在http://jakarta.apache.org/Log4j/上找到。順便,Log4j已經給C, C++, C#, Python, Ruby, and Eiffel 語言都提供了接口。

    為了調試而插入日志輸出到代碼里是一個低技術成分的方法,但它可能也是唯一的方法,因為調試器并不是一直可用或者可以適應的,尤其對于多線程的分布使式的大型程序而言。

    經驗指出調試是軟件開發周期中一個重要的組成部分。

    Log4j擁有幾個優點:

    首先,它提供關于運行程序的準確的環境。一旦代碼被插入,不需要人工干預就可以產生調試信息。

    其次,日志輸出可以被有計劃的保存在永久媒體中以便日后研究。

    另外,除了在開發周期中,一個充分詳盡的日志包可以被用來作為以后的統計工具。

    Log4j當然還有它的缺點,它可能減慢程序。如果太詳細,它可能導致屏幕盲目滾動。排除這些情況,Log4j是可靠的,快速的,可以擴展的。因為日志很少是一個應用程序的主要目的, 設計者們正努力使得Log4j API學習和使用簡單化。

    3. 日志類別、輸出源和布局

    Log4j有三個主要的組件:日志類別(Loggers)、輸出源( Appenders)和布局(Layouts)。這三種類型的組件一起工作使得開發員可以根據信息的類型和級別記錄它們,并且在運行時控制這些信息的輸出格式和位置。

    3.1 日志類別的層次結構(Loggers)

    Log4j首要的相對于簡單的使用System.out.println()方法的優點是基于它的在禁止一些特定的信息輸出的同時不妨礙其它信息的輸出的能力。這個能力源自于日志命名空間,也就是說,所有日志聲明的空間,它根據一些開發員選擇的公式而分類。以前的觀察引導我們選擇類別作為包的中心概念。然而,自從Log4j的1.2版本,Logger類被Catalog類所取代,對于那些熟悉Log4j以前版本的人來說,Logger類可以被想象成僅僅是Category 類的別名。

    Loggers 被指定為實體,Logger的名字是大小寫敏感的,它們遵循以下的命名

    規則:

    2 命名繼承

    如果類別的名稱(后面加一個點)是其子類別名稱的前綴,則它就是另一個類別的祖輩。

    如果一個類別(Logger)和它的子類別之間沒有其它的繼承關系,我們就稱之為parent與child的關系。

    例如,類別"com.foo"是類別"com.foo.Bar"的parent。相似的,"java"是"java.util"的parent,是"java.util.Vector"的父輩。.這個命名規則應該被大多數的開發員所熟悉。

    根(root) 類別位于logger繼承結構的最上層。它有兩種例外:

    1.它一直存在

    2.它不能根據名稱而獲得。

    調用類的靜態方法Logger.getRootLogger可以得到它。其它所有的Logger可以通過靜態方法Logger.getLogger而得到它們自己的實例。這個方法取希望的Logger名作為參數。Logger的一些基本的方法示例如下:

    package org.apache.Log4j;

    public Logger class {

    // 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);

    // generic printing method:

    public void log(Level l, Object message);

    }

    Loggers可以被分配的級別。所有級別的集合包括:

    DEBUG

    INFO

    WARN

    ERROR

    FATAL

    它們被定義于org.apache.Log4j.Level 類。雖然我們不鼓勵,但是你們可以通過繼承Level類來定義你們自己的級別。我們隨后將介紹一個比較好的方法。

    如果一個Logger沒有被分配一個級別,那么它將從一個被分配了級別的最接近它的ancestor哪里繼承。

    正規的說:

    2 級別繼承

    對于一個給定的Logger C,它的繼承的級別等于從C開始上溯到的第一個擁有非空級別的Logger的級別。

    為了保證所有的Logger最終能夠繼承到一個級別,根Logger通常有一個已經定義了的級別。

    以下四個表中的數據演示了根據以上規則得到的結果。

    類別名
    分配的級別
    繼承的級別

    root
    Proot
    Proot

    X
    none
    Proot

    X.Y
    none
    Proot

    X.Y.Z
    none
    Proot

    Example 1



    在例子1中,只有根Logger定義了一個級別,它的級別的值--"Proot"被所有其它的Loggers X, X.Y, 和X.Y.Z所繼承。

    類別名
    分配的級別
    繼承的級別

    root
    Proot
    Proot

    X
    Px
    Px

    X.Y
    Pxy
    Pxy

    X.Y.Z
    Pxyz
    Pxyz

    Example 2



    在例子2中,所有的Logger都有一個被分配的級別值,所以它們不需要級別繼承。

    類別名
    分配的級別
    繼承的級別

    root
    Proot
    Proot

    X
    Px
    Px

    X.Y
    none
    Px

    X.Y.Z
    Pxyz
    Pxyz

    Example 3



    在例子3中,根Logger,以及X和X.Y.Z被分別分配了級別Proot,Px和Pxyz。Logger X.Y從它的parent X繼承了級別值Px。

    類別名
    分配的級別
    繼承的級別

    root
    Proot
    Proot

    X
    Px
    Px

    X.Y
    none
    Px

    X.Y.Z
    none
    Px

    Example 4



    在例子4中,根Logger和X被分別分配了級別"Proot"和"Px",Logger X.Y 和 X.Y.Z從被分配了級別的最接近它們的ancestor X那里得到繼承。

    我們需要通過調用Logger的輸出的實例方法之一來實現日志請求。這些輸出的方法是debug, info, warn, error, fatal 和 log.

    通過定義輸出方法來區分日志的請求的級別。例如,如果c是一個Logger的實例,那么聲明 c.info 就是一個INFO級別的日志請求。

    如果一個日志的請求的級別高于或等于日志的級別那么它就能被啟用。反之,將被禁用。一個沒有被安排級別的Logger將從它的父輩中得到繼承。這個規則總結如下。

    2 基本的選擇規則

    假如在一個級別為q的Logger中發生一個級別為p的日志請求,如果p>=q,那么請求將被啟用。

    這是Log4j的核心原則。它假設級別是有序的。對于標準級別,我們定義DEBUG < INFO < WARN < ERROR < FATAL.

    以下是關于這條規則的一個例子。

    // get a logger instance named "com.foo"

    Logger logger = Logger.getLogger("com.foo");

    // Now set its level. Normally you do not need to set the

    // level of a logger progamitcally. This is usually done

    // in configuration files.

    cat.setLevel(Level.INFO);

    Logger barlogger = Logger.getLogger("com.foo.Bar");

    // This request is enabled, because WARN >= INFO.

    logger.warn("Low fuel level.");

    // This request is disabled, because DEBUG < INFO.

    logger.debug("Starting search for nearest gas station.");

    // The logger instance barlogger, named "com.foo.Bar",

    // will inherit its level from the logger named

    // "com.foo" Thus, the following request is enabled

    // because INFO >= INFO.

    barlogger.info("Located nearest gas station.");

    // This request is disabled, because DEBUG < INFO.

    barlogger.debug("Exiting gas station search");

    調用getLogger方法將返回一個同名的Logger對象的實例。

    例如,

    Categoty x = Logger.getLogger("wombat");

    Categoty y = Logger.getLogger("wombat");

    x和y參照的是同一個Logger對象。

    這樣我們就可以先定義一個Logger,然后在代碼的其它地方不需傳參就可以重新得到我們已經定義了的Logger的實例.

    同基本的生物學理論--父先于子相反,Log4j 的loggers可以以任何順序創造和配置。特別是,一個后實例化的"parent"logger能夠找到并且連接它的子logger。

    配置Log4j的環境通常在一個應用程序被初始化的時候進行,最好的方法是通過讀一個配置文件。這個方法我們將簡短介紹。

    Log4j使得通過軟件組件命名logger很容易。我們可以通過Logger的靜態的初始化方法在每一個類里定義一個logger,令logger的名字等于類名的全局名,而實現logger的命名。這是一個實效的簡單的定義一個logger的方法。因為日志輸出帶有產生日志的類的名字,這個命名策略使得我們更容易定位到一個日志信息的來源。雖然普通,但卻是命名logger的常用策略之一。Log4j沒有限制定義logger的可能。開發員可以自由的按照它們的意愿定義logger的名稱。

    然而,以類的所在位置來命名Logger好象是目前已知的最好方法。

    3.2 輸出源(Appenders)和布局(Layouts)

    有選擇的能用或者禁用日志請求僅僅是Log4j的一部分功能。Log4j允許日志請求被輸出到多個輸出源。用Log4j的話說,一個輸出源被稱做一個Appender. 。Appender包括console(控制臺), files(文件), GUI components(圖形的組件), remote socket servers(socket 服務), JMS(java信息服務), NT Event Loggers(NT的事件日志), and remote UNIX Syslog daemons(遠程UNIX的后臺日志服務)。它也可以做到異步記錄。

    一個logger可以設置超過一個的appender。

    用addAppender 方法添加一個appender到一個給定的logger。對于一個給定的logger它每個生效的日志請求都被轉發到該logger所有的appender上和該logger的父輩logger的appender上。換句話說,appender自動從它的父輩獲得繼承。舉例來說,如果一個根logger擁有一個console appender,那么所有生效的日志請求至少會被輸出到console上。如果一個名為C的logger有一個file類型的appender,那么它就會對它自己以及所有它的子logger生效。我們也可以通過設置appender的additivity flag 為false,來重載appender的默認行為,以便繼承的屬性不在生效。

    調節輸出源(appender)添加性的規則如下。

    輸出源的可添加性(Appender Additivity )

    一個名為C的logger的日志定義的輸出將延續到它自身以及它的ancestor logger的appenders。這就是術語"appender additivity"的含義。

    然而,logger C的一個ancestor logger P,它的附加標志被設為false,那么C的輸出將被定位到所有C的appender,以及從它開始上溯到P的所有ancestor logger的appender。

    Loggers的附加標記(additivity flag)默認為true。

    下表是一個例子。

    Logger
    Name
    Added
    Appenders
    Additivity
    Flag
    Output Targets
    Comment

    root
    A1
    not applicable
    A1
    The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.

    x
    A-x1, A-x2
    true
    A1, A-x1, A-x2
    Appenders of "x" and root.

    x.y
    none
    true
    A1, A-x1, A-x2
    Appenders of "x" and root.

    x.y.z
    A-xyz1
    true
    A1, A-x1, A-x2, A-xyz1
    Appenders in "x.y.z", "x" and root.

    security
    A-sec
    false
    A-sec
    No appender accumulation since the additivity flag is set to false.

    security.access
    none
    true
    A-sec
    Only appenders of "security" because the additivity flag in "security" is set to false.


    經常,用戶希望自定義不但輸出源,而且定義輸出格式。這個是通過在一個appender上附加一個layout來完成的。layout是負責根據用戶的希望來格式化日志請求。而appender是負責發送格式化的輸出到它的目的地。PatternLayout,作為Log4j標準版中的一部分,讓用戶指以類似C語言的printf方法的格式來指定日志的輸出格式。

    例如,轉化模式為"%r [%t] %-5p %c - %m%n" 的PatternLayout 將輸出類似如下的信息:

    176 [main] INFO org.foo.Bar - Located nearest gas station.

    第一個欄位是自從程序開始后消逝的毫秒數。

    第二個欄位是做出日志的線程。

    第三個欄位是log的級別。

    第四個欄位是日志請求相關的logger的名字。而"-"后的文字是信息的表述。

    Log4j將根據用戶定義的公式來修飾日志信息的內容。例如,如果你經常需要記錄Oranges,一個在你當前的項目被用到的對象類型,那么你可以注冊一個OrangeRenderer ,它將在一個orange需要被記錄時被調用。

    對象渲染類似的類的結構繼承。例如,假設oranges是fruits,如果你注冊了一個FruitRenderer,所有的水果包括oranges將被FruitRenderer所渲染。除非你注冊了一個orange。

    對象渲染必須實現ObjectRenderer接口。
    posted on 2007-01-03 17:00 ???MengChuChen 閱讀(275) 評論(0)  編輯  收藏 所屬分類: Log4j
    主站蜘蛛池模板: 亚洲精品和日本精品| 色偷偷噜噜噜亚洲男人| 精品国产污污免费网站入口在线| 精品久久久久久久免费人妻| 亚洲另类无码专区首页| 女人18特级一级毛片免费视频| 亚洲H在线播放在线观看H| 无码少妇一区二区浪潮免费| 在线观看亚洲AV日韩AV| 免费鲁丝片一级在线观看| 国产综合成人亚洲区| 亚洲国模精品一区| 大地影院MV在线观看视频免费| 久久亚洲国产欧洲精品一| 99爱在线精品视频免费观看9| 亚洲色图校园春色| 国产亚洲精品观看91在线| 在线免费观看中文字幕| 国产色爽免费视频| 亚洲国产av玩弄放荡人妇| 亚洲狠狠爱综合影院婷婷| 成在人线av无码免费高潮喷水 | 成人五级毛片免费播放| 亚洲色大网站WWW永久网站| 在线a亚洲v天堂网2018| 中国videos性高清免费| 亚洲国产成人综合| 又大又硬又爽免费视频| 免费视频成人手机在线观看网址| 亚洲精品免费在线视频| 日韩激情无码免费毛片| 大地资源网高清在线观看免费 | 光棍天堂免费手机观看在线观看| 亚洲麻豆精品果冻传媒| 国产美女无遮挡免费视频网站 | 亚洲AV伊人久久青青草原 | 免费激情网站国产高清第一页| 中文字幕亚洲日韩无线码| 亚欧免费视频一区二区三区| 国产尤物在线视精品在亚洲| 久久精品国产亚洲网站|