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

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

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

    太陽雨

    痛并快樂著

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      67 Posts :: 3 Stories :: 33 Comments :: 0 Trackbacks

        在維護系統(tǒng)時,難免會時不時地跟代碼再次打些交道。今天想再操刀做個小工具時,居然不太記得了log4j的配置,不得不從apache再重新down了相關的jar與DOC,匆匆看看了一下,快點寫下來,日后肯定還用得著,同時也希望對網(wǎng)友們有用。 

        Log4j基本上已經(jīng)是java里的首選日志工具了,它主要由三部分組成:Loggers, Appenders和Layouts (注意后面都加了s啦,顧名思義一個配置中可以分別允許有多個此類對象存在,后面將詳細介紹)。

        Loggers-用來定義日志消息的類型及級別;

        Appenders-用來定義日志消息的輸出終端;

        Layouts-用來定義日志消息的輸出格式。

      
       
    Logger

        Loggers層次:

        logger的名字是大小寫敏感。

    規(guī)則-如果類P的名字是另一個類C的名字的前綴,且P與C之間以“.”號連接起來,那么稱P為祖先層次;如果層次A與其子層次之間沒有任何父層次,則認為層次A為父層次。

        例如,org.apache.log4j是org.apache.log4j.Logger的父層次;而org.apache是org.apache.log4j與org.apache.log4j.Logger的祖先層次。

        另外,注意log4j中有個默認的root級別的logger,在所有l(wèi)ogger中,它是最高級別,其它所有l(wèi)ogger均繼承于root,root有以下二個特性:

        1. 它總是存在的。

        2. 它不能通過名字直接獲取其實例(root實例可以通過類Logger的靜態(tài)方法Logger.getRootLogger獲得,而其它logger則可以直接通過名字來獲取Logger.getLogger)。

        關于Loggers中的級別:

       對每個logger,可以指定其級別,在系統(tǒng)org.apache.log4j.Level中,已經(jīng)定義了五個級別,分別為debug, info, warn, error, fatal。

    規(guī)則-設當前l(fā)ogger為X,從X開始往X的父類方向開始算(包括X本身),直到名為root的logger,第一個不為null的級別值就是X的級別值。

        日志顯示:  
        
    級別的定義是為了過濾性地選擇日志。

    規(guī)則-若當前請方式級別為P,而當前的logger的級別為Q,當且僅當在P>=Q的情況下,日志信息才能顯示。


       
    關于日志中級別的關系為:DEBUG < INFO < WARN < ERROR < FATAL
        關于此規(guī)則的說明,有以下代碼為實例:   

    // 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 programmatically. This is usually done

       // in configuration files.

       logger.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");

    Appenders與Layouts

    Appender正如前面所述,是用來定義日志信息的輸出終端,最覺的輸出終端有console與file了,另外還有其它如GUI components, JMS, NT Event Loggers, remote socket servers等等。

        Appender也有類似繼承的原則,即當前l(fā)ogger的appender包括其它父類的appender。這樣就會出現(xiàn)一個logger可能擁有多個appender了,在現(xiàn)實中看來,就是log4j的日志信息可以同進輸出到console, file等等終端了。當然,為了不使此appender惡性疊加,可以通過設置additivity標志來阻止繼承。

        規(guī)則-若當前l(fā)ogger為C,則C擁有包括其自己及其父類的所有appender。另外,若C的父logger為P,且P的additivity標志已經(jīng)設置成為false,則C只擁有自己及P的appender了,而P則只能擁有本身的appender。

        以下表格可以清晰說明此規(guī)則:
        
    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.
        
        
        對于layout,也正如前面所述,是用來定義日志信息的輸出格式,它的與C語言中
    printf函數(shù)的格式定義基本相似,本人對printf中的格式參數(shù)不太熟悉,總感覺有些復雜,一般是平時看到自己認為有用的格式就記一下,到時直接搬過來。如

    log4j.appender.R.layout.ConversionPattern=--->%-d{yyyy-MM-dd HH:mm:ss} [%5p]%l - %m%n

    時,日志信息格式為:

    --->2008-07-11 01:13:40 [ INFO]com.test.Log4jTest.main(Log4jTest.java:27) - Exiting application.

        
        好啦,現(xiàn)在log4j的理論很膚淺地扯了一下,現(xiàn)在可以開始配置了。

       配置:   

        Log4j
    的配置可以通過加載Java的properties配置文件或者XML文件來完成。

        Log4j默認的配置為,通過讀取系統(tǒng)變量log4j.configuration來找到配置文件,當然變量的默認值為log4j.properties,所以若沒有設置此系統(tǒng)變量,可以直接將配置文件命名為log4j.properties,然后放到類路徑下即可。另外,若想引用通過其它配置文件,則可以通過

        Loader.getResource(java.lang.String)來讀取指定的配置文件。

        其它:

        1. 由于有了log4j中的級別繼承機制,所以可以很方便地過濾信息了,不僅可以很方便地限制日志的輸出量,也可以同時將日志輸出到不同的終端。
        另外,因為在java文件中,文件的物理層次關系也是直接通過“.”符號來控制的,且在很在程度上這個物理層次也決定了文件的邏輯層次,所以我們在當前文件中獲取logger時,可以直接通過當前文件的類名來獲取,如:
        
        static Logger logger = Logger.getLogger(MyApp.class);
        這樣,在過濾消息時就很簡單了,簡單示例如下:
        在配置文件中有
        log4j.rootLogger=ERROR,stdout,R
        log4j.category.com.db=DEBUG
        log4j.category.com.i18n=INFO
        log4j.category.com.zyx=fatal

        默認的root logger的日志級別為Error,根據(jù)級別關系這個級別也相當高了,這樣可以減少系統(tǒng)中日志的輸出量,但有些地方可能得輸出更詳細信息,如數(shù)據(jù)庫部分,所以可以將com.db設置成了debug。另外,我在com.zyx下,我只想看到類型為fatal的日志,也可以如上所設。

     

        2. log4j.rootLogger=ERROR,stdout, ROLLING_FILE這個定義表示root logger的日志級別為Error,后面的stdout, ROLLING_FILE表示此root有二個appender,通常可以通過這樣來定義日志可以同時向多個終端輸出,因為子logger可以繼承所有父logger的appender.

        如我可以通過以下定義將日志同時往console及file輸出:

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    log4j.appender.stdout.layout.ConversionPattern=--->%-d{yyyy-MM-dd HH:mm:ss} [%5p]%l - %m%n

     

    log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender

    log4j.appender.ROLLING_FILE.File=myapp.log

    log4j.appender.ROLLING_FILE.Append=true

    log4j.appender.ROLLING_FILE.MaxFileSize=1024KB

    log4j.appender.ROLLING_FILE.MaxBackupIndex=10

    log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout

    log4j.appender.ROLLING_FILE.layout.ConversionPattern==[slf5s.start]%d{DATE}[slf5s.DATE]%n"

       %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n"

       %c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n

     

        馬馬虎虎總結了一下,但也花費了二個多小時,呵呵!

    posted on 2008-11-02 14:49 小蟲旺福 閱讀(147) 評論(0)  編輯  收藏

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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲国产电影在线观看| 亚洲成A∨人片在线观看不卡| 亚洲午夜一区二区电影院| 久久久99精品免费观看| 亚洲av女电影网| 久久久久免费看成人影片| 91天堂素人精品系列全集亚洲| 一个人免费日韩不卡视频| 久久久久久久亚洲Av无码| 91香蕉在线观看免费高清| 亚洲另类小说图片| 欧洲精品成人免费视频在线观看| 亚洲精品中文字幕无乱码麻豆| 最近免费中文字幕4| 日韩亚洲翔田千里在线| 免费在线观看中文字幕| 国产免费AV片在线观看| 国产亚洲精品美女2020久久| 国产美女精品视频免费观看| 丰满妇女做a级毛片免费观看| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 国产啪亚洲国产精品无码 | 亚洲国产精品久久网午夜| 国产免费久久精品99re丫y| 亚洲日韩av无码中文| 亚洲性日韩精品一区二区三区| 国产免费阿v精品视频网址| 亚洲欧洲精品在线| 国产成人免费高清在线观看| 一二三四在线观看免费中文在线观看| 亚洲亚洲人成综合网络| 国产在线观看片a免费观看| 色欲aⅴ亚洲情无码AV| 伊人久久精品亚洲午夜| 无码乱肉视频免费大全合集| 老妇激情毛片免费| 亚洲国产国产综合一区首页| 日韩高清免费在线观看| 成人A片产无码免费视频在线观看 成人电影在线免费观看 | 国产成人免费在线| 成人免费网站久久久|