對於一個Java開發者而言,Log4j是咱們的好朋友了。話說到這裏,須要自我反省一下,這麼久以來,凡是用到Log4j的地方,相關的配置文件都是直接拷貝過去,歷來都沒仔細看過。But thanks God,在剛剛的項目中,由於一些特殊的需求,有機會好好看了一下log4j,說來慚愧。java
目錄sql
一、Appenders數據庫
二、Layoutsapache
三、Odds and ends架構
1、Appendersapp
Appenders是指log4j中全部繼承自Appender接口的類。他們一塊兒定義了log4j須要把日誌寫到哪些地方,控制檯?數據庫或者是文件系統。他們的家族挺簡單:nosql
與其餘大型開源項目相比,Log4j的Appender可謂簡潔明瞭。有一個抽象類AppenderSkeleton實現了Appender的大體骨架,而後衆多的具體的Appender都繼承自這個AppenderSkeleton. 目前爲止,筆者用過的Appender也就ConsoleAppender/RollingFileAppender/SMTPAppender.ide
須要用到的Appender均可以配置在log4j.properties中,e.g.ui
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
注意,Appender的配置須要以log4j.appender開頭,後面緊接着的是這個Appender的對象的名稱,在上面的配置中,名稱爲stdout. 而後就是配置實現類,配置相關參數等等。this
Log4j的這樣的Appender架構,也很方便咱們來擴展log4j,好比咱們須要把log寫入到solr或者其餘nosql中去,擴展Appender會是一個很好的方法。
package com.mzule.log.solr.appender; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; public class SolrAppender extends AppenderSkeleton { @Override public void close() { } @Override public boolean requiresLayout() { return false; } @Override protected void append(LoggingEvent event) { } }
上面是一個自定義的Appender,能夠看見,實現Appender也就三個方法:
①close方法,close方法能夠用來釋放資源,像SolrAppender這樣不須要善後的能夠直接留空。
②requiresLayout方法,requiresLayout方法標註該Appender是否須要設置layout屬性,若是返回true的話,在log4j.properties中配置該appender時,就必需要提供一種layout的實現(見下文)。
③appender方法,appender方法就是進行log的核心代碼了,在這兒new一個SolrServer而後add日誌記錄,最後commit就ok.
是否是so easy?
在coding Appender的時候,確定會但願可以讀取log4j.properties的一些參數。就像SMTPAppender須要在log4j.properties中配置to,from,smtphost等等同樣。
其實很簡單,對於簡單的字符串數據,能夠直接在Appender中定義,而後提供setters方法。再用相同的名稱在log4j.properties中配置相應的值便可。
好比說在SolrAppender中,我須要一個host地址,能夠這樣作:
public class SolrAppender extends AppenderSkeleton { protected String host; ... public void setHost(String host) { this.host = host; } }
而後在log4j.properties配置host的值:
# Direct log messages to Solr log4j.appender.solr=package.to.SolrAppender log4j.appender.solr.host=http://localhost:8080/everylog/core
這樣,在SolrAppender中就能夠直接使用host變量了。
2、Layouts
Layout就是log4j.properties中的log4j.appender.stdout.layout=org.apache.log4j.PatternLayout配置,此處爲PatternLayout,
此外,並非全部的Appender都須要layout的,好比SocketAppender就不須要layout.
3、Odds and ends
Q: 在配置Appender的時候,我怎麼知道它有哪些屬性能夠配置的?
A: 谷歌之,或者看相應Appender的源碼,源碼裏面的setters方法都是能夠做爲屬性設置的。Log4j會調用PropertySetter進行賦值。