1. 程式人生 > >Log4J學習【十三】Properties檔案中能夠定義的配置項的格式和示例二

Log4J學習【十三】Properties檔案中能夠定義的配置項的格式和示例二

3,配置Logger:
    當配置完成Appender和其對應的Layout之後,就需要把Appender繫結在Logger之上了。Logger的配置主要分兩類,一類是對RootLogger的配置,一類是對自定義Logger的配置。先來看看rootLogger的配置格式:
log4j.rootLogger=[LEVEL],[Appender1,Append2...AppendN]
    意思應該很明瞭,Level定義了rootLogger的日誌輸出級別,然後使用一個逗號分隔,逗號之後就是繫結在rootLogger之上的Appender,使用定義的Appender的名字即可。下面來看個簡單的示例,就很明瞭了:
log4j.rootLogger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

    直接來看配置檔案,在這個配置檔案中,我們定義了一個appender名字叫console。並且配置其型別為ConsoleAppender,和其layout為一個SimpleLayout。然後,我們直接使用log4j.rootLogger=INFO,console完成了對rootLogger的配置。這裡,我們定義日誌的輸出級別為INFO,並使用定義的consoleAppender來配置rootLogger。這段配置程式碼相當於:
Logger.getRootLogger().setLevel(Level.INFO);
Logger.getRootLogger().addAppender(new ConsoleAppender(new SimpleLayout()));

    來看看測試程式碼:
@Test
public void testLoggerConfig() {
    PropertyConfigurator.configure(this.getClass().getClassLoader()
.getResourceAsStream("log4j.properties"));
    Logger log=Logger.getLogger("cd.itcast.log");
    log.debug("log debug..");
    log.info("log info..");
}

    按照我們的配置和測試程式碼,應該使用SimpleLayout規定的格式輸出log info..。來看看結果:
INFO - log info..
    符合我們的預期,而且通過這個例子也能看出,定義Appender的順序和定義Logger的順序並沒有關係的。
下面再來看看多個Appender的情況:
log4j.rootLogger=INFO,console,file#log4j.rootLogger=DEBUG,console,file這裡修改為了debug後才輸出下面的效果,文件中貌似寫錯了

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
log4j.appender.file.file=log1.log

    在這段配置程式碼中,我們分別定義了兩個Appender,一個是console,一個是file。然後,我們使用log4j.rootLogger=INFO,console,file將兩個appender都新增到rootLogger上。按照我們的預期,當運行同樣的測試程式碼之後,在控制檯上會出現使用simpleLayout列印的log info...,並且在log1.log檔案中新增使用pattern格式化的log info...
    執行測試:
INFO - log info..//控制檯
0 [main] INFO cd.itcast.log  - log info..//log1.log檔案
    符合我們的預期。可以看到,要配置rootLogger還是非常簡單和清晰的。
    另外一種情況,配置自定義的Logger,格式為:
log4j.logger.loggerName=[LEVEL|INHERITED|NULL],[Appender1,Append2...AppendN]
    這裡的LEVEL和Appender和rootLogger是相似的,只是在這裡設定LEVEL的時候,多了兩個選項:INHERITED和NULL。這兩個選項的意義應該是非常明顯的,這個LEVEL符合下面的規則:1,如果沒有為一個Logger設定Level,就相當於使用NULL,即從當前體系結構中繼承LEVEL;2,如果設定logger為INHERITED,就相當於明確告訴Logger從當前體系結構中繼承LEVEL。呵呵,其實大家也能看出來,INHERITED和NULL效果是一樣的。另外,如果設定的是NULL或者INHERITED,必須要大寫。這點上,log4j是大小寫敏感的。
    下面來看一個配置logger的示例:
log4j.rootLogger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

log4j.logger.cd.itcast=DEBUG,file

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
log4j.appender.file.file=log1.log

    注意我們加粗的配置。我們配置了rootLogger級別為LEVEL,並添加了一個console appender,然後我們定義了一個名字叫cd.itcast的Logger,並設定級別為DEBUG,然後添加了一個file Appender,相當於程式碼:
Logger log=Logger.getLogger(“cd.itcast”);
log.setLevel(Level.DEBUG);
log.addAppender(fileAppender);

    那麼,當我們執行相同的測試後,按照我們的預期,cd.itcast.log繼承cd.itcast,而cd.itcast設定了日誌級別為Level.DEBUG,那麼log debug..和log info..都應該被輸出到控制檯和log1.log檔案中。執行測試:
DEBUG - log debug..//控制檯
INFO - log info..//控制檯
0 [main] DEBUG cd.itcast.log  - log debug..//log1.log
0 [main] INFO cd.itcast.log  - log info..//log1.log
    符合預期。另外,之前在我們介紹Logger體系結構中,我們介紹了一個Appender的可新增性,即logger.setAdditivity方法。同樣,這個功能也能在配置檔案中實現,設定additivity的格式為:
log4j.additivity.loggerName=true|false
    相當於呼叫loggerName.setAdditivity(true|false),配置後additivity遵循的appender繼承規律和使用程式碼的方式一致。
另外,Log4J為了能更加靈活的配置,提供了一種類似定義變數的配置方式。我們先來看個示例:
log4j.rootLogger=INFO,file
dir=${user.home}
file=log1.log
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
log4j.appender.file.file=${dir}/${file}

    在這個例子中,展示了Log4j提供的兩種變數使用方式。觀察加粗的三條配置。第一條配置,dir=${user.home},很明顯,${user.home}指代了當前使用者的主目錄,在windows中即為document and settings/user,並且把這個路徑起了個名字dir;接著第二行,指定了一個變數file,內容為log1.log。在設定log4j.appender.file.file的時候,直接使用${dir}/${file}來引用了之前定義的兩個變數,那麼,Log4j會在解析這個file值之前,使用變數的值去替換變數的名稱,即file值變成了document and setting/user/log1.log。
    執行這個示例,在C:\Documents and Settings\user\log.log檔案中就會看到:
0 [main] DEBUG cd.itcast.log  - log debug..
0 [main] INFO cd.itcast.log  - log info..
    簡單說一下Log4J對變數的值的查詢順序,首先,會在系統環境變數中按照變數的名字查詢值,如果沒有,在在配置檔案中查詢變數的值,最後,使用查詢到的值替換佔位符即可。這只是一個很小的功能點,瞭解即可。

    至此,使用property檔案配置Log4j的一些重要的配置就到這裡。使用properties方式配置Log4j在編寫配置上是非常簡單和方便的,而且Log4j在解析Properties檔案的速度也是很快的。但是,由於properties檔案本身的一些缺陷,導致一些Log4j中的高階特性無法使用properties檔案配置完成,所以,Log4j還提供了使用XML的配置方式。在XML中,可以充分發揮XML在格式上的優勢,配置很多Log4j中的很多高階特性。