目前,java中實(shí)現(xiàn)記錄日志的方式有很多種:
- 最簡單的方式,就是system.out ,err 這樣直接在控制臺(tái)打印消息了。
- java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中寫日志了。
- log4j , 最強(qiáng)大的記錄日志的方式。 可以通過配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。
- commons-logging, 最綜合和常見的日志記錄方式, 經(jīng)常是和log4j 結(jié)合起來使用。
Log4j的組成
Log4j由三個(gè)重要的組成構(gòu)成:日志記錄器(Loggers),輸出端(Appenders)和日志格式化器(Layout)。
Logger:控制要啟用或禁用哪些日志記錄語句,并對日志信息進(jìn)行級(jí)別限制。
Appenders指定了日志將打印到控制臺(tái)還是文件中。
Layout則控制日志信息的顯示格式。
1).Logger對象的獲得或創(chuàng)建
Logger被指定為實(shí)體,由一個(gè)String類的名字識(shí)別。Logger的名字是大小寫敏感的,且名字之間具有繼承關(guān)系,子名用父名作為前綴,用點(diǎn)“.”分隔。root Logger(根Logger)是所有Logger的祖先,它有如下屬性:1.它總是存在的。2.它不可以通過名字獲得。.getLogger(Class clazz)是目前創(chuàng)建Logger對象最理想的方法。
2)日志級(jí)別
每個(gè)Logger都被了一個(gè)日志級(jí)別(log level),用來控制日志信息的輸出。日志級(jí)別從高到低分為:
(1):off 最高等級(jí),用于關(guān)閉所有日志記錄。
(2):fatal 指出每個(gè)嚴(yán)重的錯(cuò)誤事件將會(huì)導(dǎo)致應(yīng)用程序的退出。
(3):error 指出雖然發(fā)生錯(cuò)誤事件,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。
(4):warm 表明會(huì)出現(xiàn)潛在的錯(cuò)誤情形。
(5):info 強(qiáng)調(diào)應(yīng)用程序的運(yùn)行全程。
(6):debug 對調(diào)試應(yīng)用程序非常有幫助。
(7):all 最低等級(jí),用于打開所有日志記錄。
上面這些級(jí)別是定義在org.apache.log4j.Level類中。Log4j只建議使用4個(gè)級(jí)別,優(yōu)先級(jí)從高到低分別是error,warn,info和debug。通過使用日志級(jí)別,可以控制應(yīng)用程序中相應(yīng)級(jí)別日志信息的輸出。如果配置文件使用了info級(jí)別,則應(yīng)用程序中所有低于info級(jí)別的日志信息(如debug)將不會(huì)被打印出來。
3)輸出端Appender
Appender用來指定日志信息輸出到哪個(gè)地方,可以同時(shí)指定多個(gè)輸出目的地。Log4j允許將信息輸出到許多不同的輸出設(shè)備中,一個(gè)log信息輸出目的地就叫做一個(gè)Appender。每個(gè)Logger都可以擁有一個(gè)或多個(gè)Appender,每個(gè)Appender表示一個(gè)日志的輸出目的地??梢允褂肔ogger.addAppender(Appender app)為Logger增加一個(gè)Appender,也可以使用Logger.removeAppender(Appender app)為Logger刪除一個(gè)Appender。以下為Log4j幾種常用的輸出目的地:
a)、org.apache.log4j.ConsoleAppender:將日志信息輸出到控制臺(tái)。
b)、org.apache.log4j.FileAppender:將日志信息輸出到一個(gè)文件。
c)、org.apache.log4j.DailyRollingFileAppender:將日志信息輸出到一個(gè)日志文件,并且每天輸出到一個(gè)新的日志文件。
d)、org.apache.log4j.RollingFileAppender:將日志信息輸出到一個(gè)日志文件,并且指定文件的尺寸,當(dāng)文件大小達(dá)到指定尺寸時(shí),會(huì)自動(dòng)把文件改名,同時(shí)產(chǎn)生一個(gè)新的文件。
e)、org.apache.log4j.WriteAppender:將日志信息以流格式發(fā)送到任意指定地方。
f)、org.apache.log4j.jdbc.JDBCAppender:通過JDBC把日志信息輸出到數(shù)據(jù)庫中。
4)、 日志格式化器Layout
日志格式化器Layout分為:
HTMLLayout:格式化日志輸出為HTML表格形式。
SimpleLayout:以一種非常簡單的方式格式化日志輸出,它打印三項(xiàng)內(nèi)容:級(jí)別-信息例:INFO - infoPatternLayout:根據(jù)指定的轉(zhuǎn)換模式格式化日志輸出,或者如果沒有指定任何轉(zhuǎn)換模式,就使用默認(rèn)的轉(zhuǎn)化模式格式。
Log4j的配置
配置Log4j環(huán)境就是指配置root Logger,包括把Logger為哪個(gè)級(jí)別,為它增加哪些Appender,以及為這些Appender設(shè)置Layout,等等。這些可以通過設(shè)置系統(tǒng)屬性的方法來隱式地完成,也可以在程序中調(diào)用XXXConfigurator.configure()方法來顯式地完成。有以下幾種方式來配置Log4j:
(1)、配置放在文件里,通過環(huán)境變量傳遞文件名等信息,利用Log4j默認(rèn)的初始化過程解析并配置。
(2)、配置放在文件里,通過應(yīng)用服務(wù)器配置傳遞文件甸等信息,利用一個(gè)特定的Servlet來完成配置。
(3)、在程序中調(diào)用BasicConfigor.configure()方法。
(4)、配置放在文件里,通過命令行PropertyConfigurator.configure(args[])解析log4j.properties文件并配置Log4j。
下面對BasicConfigurator.configure()方法和PropertyConfigurator.config()方法分別進(jìn)行介紹。
BasicConfigurator.configure()方法:它使用簡單的方法配置Log4j環(huán)境。這個(gè)方法完成的任務(wù)是:
1、用默認(rèn)的方式創(chuàng)建PatternLayout對象p: PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x-%m%n");
2、用p創(chuàng)建ConsoleAppender對象a,目標(biāo)是System.out,標(biāo)準(zhǔn)輸出設(shè)備: ConsoleAppender a = new CpnsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
3、為root Logger增加一個(gè)ConsoleAppender p; rootLogger.addAppender(p);
4、把rootLogger的log level設(shè)置為DUBUG級(jí)別; rootLogger.setLevel(Level.DEBUG);
PropertyConfigurator.configure()方法:當(dāng)使用以下語句生成Logger對象時(shí):
static Logger logger = Logger.getLogger(mycalss.class);
如果沒有調(diào)用BasicConfigurator.configure(),PropertyConfigurator.configure()或DOMConfigurator.configure()方法,Log4j會(huì)自動(dòng)加載CLASSPATH下名為log4j.properties的配置文件。如果把此配置文件改為其他名字,例如my.properties,程序雖然仍能運(yùn)行,但會(huì)報(bào)出不能正確初始化Log4j系統(tǒng)的提示。這時(shí)可以在程序中加上:
PropertyConfigurator.configure("classes/my.properties");