Log4j 隨筆

對於一個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進行賦值。

相關文章
相關標籤/搜索