由于Hadoop生態(tài)鏈基本都是java開發(fā)的,所以在很多有關(guān)大數(shù)據(jù)處理的開源項(xiàng)目中,常常會(huì)看到log4j這個(gè)jar包。
本文旨在對(duì)它的用法做基本說明。
2. log4j的3要素
log4j存在3個(gè)重要概念:loggers, appenders和layouts,這3個(gè)要素使得引入log4j庫(kù)的開發(fā)者可以靈活控制打印行動(dòng),如日志等級(jí)、日志內(nèi)容、日志格式及打印目的地(如本地或遠(yuǎn)程打印),等等。
2.1 loggers
事實(shí)上,loggers是1些大小寫敏感的命名實(shí)體,這些實(shí)體的命名遵守以下的層級(jí)命名規(guī)則(細(xì)節(jié)可查看文檔Short introduction to log4j):
A logger is said to be an ancestor of another logger if its name followed by a dot is a prefix of the descendant logger name. A logger is said to be a parent of a child logger if there
are no ancestors between itself and the descendant logger.
在loggers的層級(jí)結(jié)構(gòu)中,root logger處于最頂級(jí)。使用log4j庫(kù)時(shí),root logger必須被創(chuàng)建且只能通過類靜態(tài)方法Logger.getRootLogger來創(chuàng)建,而其它logger可以通過傳入logger name調(diào)用類靜態(tài)方法Logger.getLogger來實(shí)例化。
可以為logger實(shí)例指定日志等級(jí)(如通過setLevel接口),目前支持這些經(jīng)常使用等級(jí):TRACE, DEBUG, INFO, WARN, ERROR, FATAL。不斟酌TRACE,其余等級(jí)的重要程度順次為:DEBUG < INFO < WARN < ERROR < FATAL。
若某個(gè)logger實(shí)例沒有顯式指定等級(jí),則它會(huì)繼承距離它最近的、被顯式指定過日志等級(jí)的父logger實(shí)例的等級(jí)。
1旦為某個(gè)logger實(shí)例指定了等級(jí),則調(diào)用該實(shí)例打印日志時(shí),只有日志等級(jí)不小于指定等級(jí)的日志會(huì)被打印,低于指定等級(jí)的日志不會(huì)被打印出來。這個(gè)規(guī)則是log4j庫(kù)的核心規(guī)則,它保證了日志等級(jí)的靈活控制。
2.2 appenders
appenders其實(shí)就是日志打印的目的地址(In log4j speak, an output destination is called an appender),目前支持的appenders包括:console, files, GUI components, remote socket servers, JMS, NT Event
Loggers, and remote UNIX Syslog daemons。
1個(gè)logger實(shí)例可以有多個(gè)appender(s),即同1條日志可以同時(shí)打印到多個(gè)目的地。
默許情況下,某logger實(shí)例的日志打印要求會(huì)打印到已為該logger實(shí)例添加的所有appenders上,另外,該日志打印要求還會(huì)沿著logger實(shí)例的層級(jí)繼承鏈向上傳播給其先人logger的所有appenders。
例如,為root logger添加console類型的appender后,root logger的日志打印要求會(huì)輸出到console,這很容易理解。現(xiàn)在假定logger實(shí)例C繼承自root,且為實(shí)例C添加了file類型的appender,則調(diào)用實(shí)例C進(jìn)行日志打印時(shí),除file appender會(huì)輸出日志外,實(shí)例C的先人,即本例中的root
logger也會(huì)收到該日志打印要求,由于root logger添加了console appender,所以,console appender也會(huì)輸出日志。這個(gè)默認(rèn)行動(dòng)可以通過將logger的additive字段設(shè)置為false來關(guān)閉。
關(guān)于appender additivity的更多說明及示例,可以參考Short introduction to log4j這篇文檔關(guān)于Appender部份的說明。
2.3 layouts
layouts可以指定日志的格式,支持的PatternLayout在文檔log4j - Class PatternLayout中有詳細(xì)說明,這里不贅述。
4. log4j庫(kù)的初始化進(jìn)程
log4j不對(duì)它的使用處景做任何假定,因此,它沒有默許的appender,也即,appender必須由使用者顯式配置。援用了log4j庫(kù)的java進(jìn)程啟動(dòng)時(shí),JVM的classloader機(jī)制會(huì)對(duì)利用程序援用到的Logger類進(jìn)行加載,而該類的靜態(tài)初始化函數(shù)會(huì)嘗試自動(dòng)配置log4j。log4j庫(kù)默許的初始化進(jìn)程在文檔Short
introduction to log4j的"Default Initialization Procedure"部份有詳細(xì)說明,感興趣的同學(xué)可以去查看。
備注:關(guān)于JVM加載class(如系統(tǒng)包或第3方擴(kuò)大包)的機(jī)制,可以通過下面幾篇文檔來理解:
1)
Understanding the Java Classloading Mechanism
2)
Understanding Extension Class Loading
3)
Internals of Java Class Loading
========================= EOF ========================