1. 介紹
1.1. Log4j 是什么?
Log4j是Apache的一個(gè)開放源代碼項(xiàng)目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,能夠更加細(xì)致地控制日志的生成過程,而這些可以通過一個(gè)配置文件來靈活地進(jìn)行配置,不需要修改應(yīng)用的代碼。
1.2. 構(gòu)成Log4j的三大類組件
(1) Logger : 負(fù)責(zé)輸出信息日志信息,并能夠?qū)θ罩拘畔⑦^濾,確定哪些日志信息輸出,哪些信息被忽略。
(2) Appender : 指定日志輸出到什么地方,可以是控制臺、文件或網(wǎng)絡(luò)設(shè)備等等。
(3) Layouts : 加在Appender后面用以實(shí)現(xiàn)格式化輸出日志的內(nèi)容。
2. Log4j的設(shè)置
第一步:加入log4j的jar包到lib下。
第二步:在CLASSPATH下建立log4j.properties或XML格式的配置文件。
第三步:導(dǎo)入所有需的commongs-logging類:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
第四步:在自己的類中定義一個(gè)org.apache.commons.logging.Log類的私有靜態(tài)類成員:
private final Log log = LogFactory.getLog(getClass());
LogFactory.getLog()方法的參數(shù)使用的是當(dāng)前類的class。
第五步:使用org.apache.commons.logging.Log類的成員方法輸出日志信息:
例如:if (log.isDebugEnabled())
{log.debug("Test log4j!");}
3. Log4j的配置文件
3.1 Log4j輸出日志信息的優(yōu)先級
Log4j輸出日志信息的級別分別為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log4j建議只使用四個(gè)級別,優(yōu)先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,可以控制到應(yīng)用程序中相應(yīng)級別的日志信息的開關(guān)。比如在這里定義了INFO級別,只有等于及高于這個(gè)級別的才進(jìn)行處理,則應(yīng)用程序中所有DEBUG級別的日志信息將不被打印出來。ALL:打印所有的日志,OFF:關(guān)閉所有的日志輸出。
3.2 Log4j配置文件的詳細(xì)介紹
Log4j支持兩種配置文件格,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。下面將介紹使用log4j.properties文件作為配置文件的方法:
①、 配置根Logger
Logger 負(fù)責(zé)處理日志記錄的大部分操作。
其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志記錄的優(yōu)先級。
②、 配置日志信息輸出目的地 Appender
Appender 負(fù)責(zé)控制日志記錄操作的輸出。
其語法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
這里的appenderName為在①里定義的,可任意起名。
其中,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制臺),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件),可通過log4j.appender.R.MaxFileSize=100KB設(shè)置文件大小,還可通過log4j.appender.R.MaxBackupIndex=1設(shè)置為保存一個(gè)備份文件。
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
定義一個(gè)名為stdout的輸出目的地,ConsoleAppender為控制臺。
③、配置日志信息的格式(布局)Layout
Layout 負(fù)責(zé)格式化Appender的輸出。
其語法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
格式化日志信息:
Log4J采用類似C語言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)如下:
%m 輸出代碼中指定的消息
%p 輸出優(yōu)先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應(yīng)用啟動到輸出該log信息耗費(fèi)的毫秒數(shù)
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產(chǎn)生該日志事件的線程名
%n 輸出一個(gè)回車換行符,Windows平臺為“rn”,Unix平臺為“n”
%d 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。
4.Logger組件的繼承性
Log4j中定義的Logger可以有繼承關(guān)系,Log4j提供了一個(gè)root Logger,它是所有Logger的”根”,其它的Logger都會繼承root Logger.Logger 之間的繼承關(guān)系是通過名稱體現(xiàn)的,例如:log4j.logger.helloappLogger.childLogger的名稱是在log4j.logger.helloappLogger之后加符號“.”定義的,則childLogger繼承helloappLogger.
Logger組件的繼承關(guān)系有以下特點(diǎn):
● 如果子Logger沒有定義日志級別,則繼承父Logger的日志級別。
● 如果子Logger定義了日志級別,則不會繼承父Logger的日志級別。
● 默認(rèn)情況,子Logger會繼承Logger的所有Appender,反它們加入到自己的Appender中。
附錄 A Log4j配置相對路徑實(shí)現(xiàn)日志記錄
解決Log4j配置相對路徑實(shí)現(xiàn)日志記錄有三種辦法:
①、 用相對路徑代替絕對路徑
其實(shí)log4j的FileAppender本身就有這樣的機(jī)制,如:log4j.appender.logfile.File=${WORKDIR}/logs/app.log其中“${WORKDIR}/”是個(gè)變量,會被System Property中的“WORKDIR”的值代替。這樣,我們就可以在log4j加載配置文件之前,先用System.setProperty設(shè)置好根路徑
②、 可以使用環(huán)境變量
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.base}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB
③、 采用了動態(tài)改變?nèi)罩韭窂椒椒▉韺?shí)現(xiàn)相對路徑保存日志文件
代碼:
public class Log4jInit extends HttpServlet {
static Logger logger = Logger.getLogger(Log4jInit.class);
public Log4jInit() { }
public void init(ServletConfig config) throws ServletException {
String prefix = config.getServletContext().getRealPath("/"); String file = config.getInitParameter("log4j");
String filePath = prefix + file;
Properties props = new Properties();
try {
FileInputStream istream = new FileInputStream(filePath);
props.load(istream);
istream.close();
String logFile = prefix + props.getProperty("log4j.appender.file.File");//設(shè)置路徑
props.setProperty("log4j.appender.file.File",logFile);
PropertyConfigurator.configure(props);//裝入log4j配置信息
} catch (IOException e) {
toPrint("Could not read configuration file [" + filePath + "]."); toPrint("Ignoring configuration file [" + filePath + "]."); return; }
}
public static void toPrint(String content) {
System.out.println(content);
}
}
(2).Web.xml中的配置
代碼
- <servlet>
- <servlet-name>log4j-init</servlet-name>
- <servlet-class>Log4jInit</servlet-class>
- <init-param>
- <param-name>log4j</param-name>
- <param-value>WEB-INF/classes/log4j.properties</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>