簡單介紹概念原理及配置,主要搬運至網絡其餘資料,備忘。java
Log4j包含3個主要部件,記錄器(Loggers)、輸出源(Appenders)和佈局器(Layouts)。這3個組件一塊兒工做可讓開發者根據消息的類別和等級來輸出消息,並控制運行時這些消息的輸出樣式和在哪裏輸出這些消息。apache
Loggers按層次命名,假如一個Loggers後面跟着標示子記錄器前綴的「.」號,那麼它被看做是另外一個Loggers的父祖Loggers。
根Loggers一直存在,並位於Loggers的頂端。與其餘Loggers不一樣,它有例外特性:網絡
它老是存在;app
它不能夠經過名稱得到;異步
Loggers能夠設置級別,可能的級別包括:DEBUG、INFO、WARN、ERROR等等。假如一個Loggers沒有設置級別,那麼它的級別等於最近一個帶有指定級別的父祖Loggers的級別。級別繼承的正式表達是:繼承的級別被指定給Loggers C,在Loggers層次中,它是和第一個非空級別相等的。爲了確保全部的Loggers最終能夠繼承一個級別,根Loggers老是被設置一個級別。
咱們一般經過調用一個Loggers的打印方法來處理日誌請求;經過定義,打印方法決定一個日誌請求的級別;若日誌請求的級別大於等於Loggers的日誌級別,那麼這個日誌請求會被記錄。下面是基本的選擇規則:在一個具備q級別的loggers(包括指定和繼承)中有一個p級別的日誌請求,若p>=q這個日誌請求是能夠輸出的;佈局
基於Loggers有選擇的讓日誌請求生效僅僅是Log4j能力的一部分,Log4j容許用戶將日誌輸出到多個目的地。在Log4j的聲明中,輸出目的地被稱爲appender。如今,輸出源包含控制檯、文件、Gui組件、遠程套接字服務、JMS、NT事件記錄器和遠程unix syslog守護進程。它也能夠異步的記錄日誌。
一個Loggers能夠有多個Appender。
AddAppender方法添加一個Appender到指定的Loggers。這個Loggers會把有效的日誌請求輸出到全部的輸出源Appenders,Appenders被Loggers附加繼承了其層次結構。
輸出源Appender的附加特性:
Loggers C的日誌語句輸出將定向到C和它全部父祖的Appenders,這是appender additivity的附加特性。然而,假若有一個C的父祖P,其附加標識被設置爲false,而後C的日誌輸出將定向到C及其直到父祖P的Appenders,但不包括P的父祖中的任何Appender。Loggers有其附加特性,默認true。
時常,用戶不只僅但願自定義日誌輸出目的地,也一樣但願設置日誌的輸出樣式。這能夠經過給Appender添加Layout實現。
例如,帶有"%r [%t] %-5p %c - %m%n"轉換格式的PatternLayout佈局器將輸出和下面的內容相似。學習
176 [main] INFO org.foo.Bar - Located nearest gas station.
第一個字段是自從程序開始到目前花費的時間。第二個字段是發出日誌請求的線程。第三個字段是日誌語句的級別。第四個是和該日誌請求關聯的日誌記錄器的名稱。緊接着「-」符號後面的內容是日誌語句的消息。ui
xml更靈活且有一些properties文件沒有的功能,如根據日誌的級別輸出到不一樣的文件中。.net
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> </layout> </appender> <root> <priority value ="debug" /> <appender-ref ref="console" /> </root> </log4j:configuration>
這將輸出高於或等於debug級別的信息到console,注意:線程
首先定義一個Appender,並設置一個name(本例中名爲console)。爲Appender設置layout(本例中爲PatternLayout),爲layout設置pattern。layout的必備條件是由具體的layout決定的,因此須要檢查你選擇的layout的javadoc(PatternLayout是最經常使用的)。
在這個示例中並無定義logger,但配置了root logger。全部的loggers都繼承自root logger,因此在本例中,高於、等於debug的消息會輸出到console。
爲了更好的理解更多示例,瞭解xml配置格式是很是有用的。它是由jar中org.apache.log4j.xml包下的log4j.dtd定義的。這裏並無列舉文件中的全部內容,你須要自助查看。若是你不熟悉xml dtd格式,最好找本相關書籍學習。
接近文件的開始,以下:
<!ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?, categoryFactory?)>
這個節點定義了xml配置文件的預期構造:0或更多renderer、0或更多appender、0或更多logger、0或1個root,0或1個categoryFactory。若是文件不知足條件,將會在文件讀入的時候報xml解析錯誤。注意,category等價與logger。
接下來,log4j.dtd定義了xml文件容許的屬性。
<!ATTLIST log4j:configuration xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" threshold (all|debug|info|warn|error|fatal|off|null) "null" debug (true|false|null) "null" >
dubug 多是最重要的屬性,設置爲true,它將輸出xml的配置信息並配置log4j環境。它在解決配置文件不像預期的工做特別重要。
threshold 閥值,待描述。
定義輸出debug跟蹤信息的位置,若是log4j沒有定義最少一個Appender,這將是無心義的。有用的信息不會顯示到任何地方。
讓咱們從新來看log4j.dtd,appender描述以下:
<!ELEMENT appender (errorHandler?, param*, layout?, filter*, appender-ref*)> <!ATTLIST appender name ID #REQUIRED class CDATA #REQUIRED >
appender必須包含name、class屬性。name用來在配置文件中引用Appender。class必須是Appender類的全限定名(如org.apache.log4j.ConsoleAppender)。
Appender包含下列子節點:
0或1個errorHandler
0或更多param
0或1個layout
0或更多filter
0或更多appender-ref
因此,根據上文,基本的console示例以下:
<appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> </layout> </appender>
當前,已有如下appender class:
org.apache.log4j.ConsoleAppender ConsoleAppender
org.apache.log4j.FileAppender FileAppender
org.apache.log4j.jdbc.JDBCAppender JDBCAppender
org.apache.log4j.AsyncAppender AsyncAppender
org.apache.log4j.net.JMSAppender JMSAppender
org.apache.log4j.lf5.LF5Appender LF5Appender
org.apache.log4j.nt.NTEventLogAppender NTEventLogAppender
org.apache.log4j.varia.NullAppender NullAppender
org.apache.log4j.net.SMTPAppender SMTPAppender
org.apache.log4j.net.SocketAppender SocketAppender
org.apache.log4j.net.SocketHubAppender SocketHubAppender
org.apache.log4j.net.SyslogAppender SyslogAppender
org.apache.log4j.net.TelnetAppender TelnetAppender
org.apache.log4j.WriterAppender WriterAppender
如今,Appender配置完成了。可是,怎麼配置loggers,使其在某些級別輸出跟蹤信息?怎麼配置logger輸出到特定的Appender?歡迎來到Logger配置。
你須要配置的最重要的就是root Logger了,下面是一個已完成的root配置:
<root> <priority value ="debug" /> <appender-ref ref="console" /> </root>
這個root logger配置輸出debug以上的信息到console appender。全部loggers的信息都會輸出到console appender。這可能很方便調試,但最終仍是須要更多特定的logger。
讓咱們再看下log4j.dtd,logger描述以下:
<!ELEMENT logger (level?,appender-ref*)> <!ATTLIST logger name ID #REQUIRED additivity (true|false) "true" >
一個logger必須包含一個name屬性。這個名字被用來建立logger實例(通常是類的全限定名)。它也能夠包含一個可選的additivity屬性。
logger能夠包含子節點:
0或一個level
0或多個appender-ref
示例以下:
<logger name="com.mycompany.apackage.MyClass"> <level value="info"/> </logger>
待補充
logger c的一個log語句會輸出到c和它全部父祖appender。這也是術語appender additivity的意義所在。
可是,若是logger c的一個父祖爲p,p的additivity屬性爲false,那麼c的輸出爲c直到p,卻不包含任何p的父祖。
loggers 的additivity默認爲true。
配置示例:
<logger name="com.eatmutton.muttonsite.torque" additivity="false"> <level value="info" /> <appender-ref ref="local-torque" /> </logger>
更多log4j配置,請參考log4jxml配置