Log4J的配置文件(Configuration File)就是用來設(shè)置記錄器的級別珊擂、存放器和布局的丧慈,它可接key=value格式的設(shè)置或xml格式的設(shè)置信息檀葛。通過配置啡莉,可以創(chuàng)建出Log4J的運(yùn)行環(huán)境忠怖。
1. 配置文件
Log4J配置文件的基本格式如下:
?#配置根Logger
log4j.rootLogger??=???[?level?]???,??appenderName1?,??appenderName2?,??…
#配置日志信息輸出目的地Appender
log4j.appender.appenderName??=??fully.qualified.name.of.appender.class?
log4j.appender.appenderName.option1??=??value1?
…?
log4j.appender.appenderName.optionN??=??valueN?
#配置日志信息的格式(布局)
log4j.appender.appenderName.layout??=??fully.qualified.name.of.layout.class?
log4j.appender.appenderName.layout.option1??=??value1?
…?
log4j.appender.appenderName.layout.optionN??=??valueN?
其中?[level]?是日志輸出級別呢堰,共有5級:
?FATAL??????0??
ERROR??????3??
WARN???????4??
INFO???????6??
DEBUG??????7?
Appender?為日志輸出目的地,Log4j提供的appender有以下幾種:
?org.apache.log4j.ConsoleAppender(控制臺)凡泣,
org.apache.log4j.FileAppender(文件)枉疼,
org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時候產(chǎn)生一個新的文件)鞋拟,
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
Layout:日志輸出格式骂维,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ù)的打印格式格式化日志信息潦刃,如下:
? %m?? 輸出代碼中指定的消息
%p?? 輸出優(yōu)先級侮措,即DEBUG,INFO福铅,WARN萝毛,ERROR,F(xiàn)ATAL?
%r?? 輸出自應(yīng)用啟動到輸出該log信息耗費(fèi)的毫秒數(shù)?
%c?? 輸出所屬的類目滑黔,通常就是所在類的全名?
%t?? 輸出產(chǎn)生該日志事件的線程名?
%n?? 輸出一個回車換行符笆包,Windows平臺為“\r\n”,Unix平臺為“\n”?
%d?? 輸出日志時間點(diǎn)的日期或時間略荡,默認(rèn)格式為ISO8601庵佣,也可以在其后指定格式,比如:%d{yyy?MMM?dd?HH:mm:ss?,?SSS}汛兜,輸出類似:2002年10月18日??22?:?10?:?28?巴粪,?921??
%l?? 輸出日志事件的發(fā)生位置,包括類目名粥谬、發(fā)生的線程肛根,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:?10?)?
2. 在代碼中初始化Logger:?
1)在程序中調(diào)用BasicConfigurator.configure()方法:給根記錄器增加一個ConsoleAppender漏策,輸出格式通過PatternLayout設(shè)為"%-4r [%t] %-5p %c %x - %m%n"派哲,還有根記錄器的默認(rèn)級別是Level.DEBUG.?
2)配置放在文件里,通過命令行參數(shù)傳遞文件名字掺喻,通過PropertyConfigurator.configure(args[x])解析并配置芭届;
3)配置放在文件里,通過環(huán)境變量傳遞文件名等信息感耙,利用log4j默認(rèn)的初始化過程解析并配置褂乍;
4)配置放在文件里,通過應(yīng)用服務(wù)器配置傳遞文件名等信息即硼,利用一個特殊的servlet來完成配置逃片。
3. 為不同的 Appender 設(shè)置日志輸出級別:
當(dāng)調(diào)試系統(tǒng)時,我們往往注意的只是異常級別的日志輸出只酥,但是通常所有級別的輸出都是放在一個文件里的褥实,如果日志輸出的級別是BUG!层皱?那就慢慢去找吧。
這時我們也許會想要是能把異常信息單獨(dú)輸出到一個文件里該多好啊赠潦。當(dāng)然可以叫胖,Log4j已經(jīng)提供了這樣的功能,我們只需要在配置中修改Appender的Threshold?就能實(shí)現(xiàn),比如下面的例子:
配置文件]
?###?set?log?levels?###
log4j.rootLogger?=?debug?,??stdout?,??D?,??E
###?輸出到控制臺?###
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{ABSOLUTE}?%5p?%c{?1?}:%L?-?%m%n
###?輸出到日志文件?###
log4j.appender.D?=?org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File?=?logs/log.log
log4j.appender.D.Append?=?true
log4j.appender.D.Threshold?=?DEBUG?##?輸出DEBUG級別以上的日志
log4j.appender.D.layout?=?org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern?=?%-d{yyyy-MM-dd?HH:mm:ss}??[?%t:%r?]?-?[?%p?]??%m%n
###?保存異常信息到單獨(dú)文件?###
log4j.appender.D?=?org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File?=?logs/error.log?##?異常日志文件名
log4j.appender.D.Append?=?true
log4j.appender.D.Threshold?=?ERROR?##?只輸出ERROR級別以上的日志!!!
log4j.appender.D.layout?=?org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern?=?%-d{yyyy-MM-dd?HH:mm:ss}??[?%t:%r?]?-?[?%p?]??%m%n
[代碼中使用]?
?public???class??TestLog4j??{
?????public???static???void??main(String[]?args)??{
????????PropertyConfigurator.configure(?"?D:/Code/conf/log4j.properties?"?);
????????Logger?logger??=??Logger.getLogger(TestLog4j.?class?);
????????logger.debug(?"?debug?"?);
????????logger.error(?"?error?"?);
????}?
}
運(yùn)行一下她奥,看看異常信息是不是保存在了一個單獨(dú)的文件error.log中瓮增。
log4j.properties文件例子
1.================================================================
這個文件就是本文的重點(diǎn)怎棱,也就是log4j的配置文件。
# Set root logger level to DEBUG and its only appender to A1?
#log4j中有五級logger?
#FATAL 0?
#ERROR 3?
#WARN 4?
#INFO 6?
#DEBUG 7?
#配置根Logger绷跑,其語法為:
#log4j.rootLogger = [ level ] , appenderName, appenderName, …
log4j.rootLogger=INFO, A1 ,R
#這一句設(shè)置以為著所有的log都輸出
#如果為log4j.rootLogger=WARN, 則意味著只有WARN,ERROR,FATAL
#被輸出拳恋,DEBUG,INFO將被屏蔽掉.
# A1 is set to be a ConsoleAppender.?
#log4j中Appender有幾層如控制臺、文件砸捏、GUI組件谬运、甚至是套接口服務(wù)器、NT的事件記錄器垦藏、UNIX Syslog守護(hù)進(jìn)程等
#ConsoleAppender輸出到控制臺?
log4j.appender.A1=org.apache.log4j.ConsoleAppender?
# A1 使用的輸出布局梆暖,其中l(wèi)og4j提供4種布局. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)掂骏,
#org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時間轰驳、線程、類別等等信息)
log4j.appender.A1.layout=org.apache.log4j.PatternLayout?
#靈活定義輸出格式 具體查看log4j javadoc org.apache.log4j.PatternLayout?
#d 時間 ....?
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n?
#R 輸出到文件 RollingFileAppender的擴(kuò)展弟灼,可以提供一種日志的備份功能级解。
log4j.appender.R=org.apache.log4j.RollingFileAppender?
#日志文件的名稱
log4j.appender.R.File=log4j.log?
#日志文件的大小
log4j.appender.R.MaxFileSize=100KB?
# 保存一個備份文件
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.TTCCLayout
#log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
2.==========================================================================================
下面我給出一個在weblogic下使用log4j的配置過程,首先給出這個配置文件的完整信息田绑。
#log4j.rootLogger=INFO,A1,R //這一句指定了日志輸出的級別為info,A1和R分別代表日志輸出到什么地方勤哗。
log4j.category.hybl_wshabcm=debug,A1,R //這一句指定了日志具體輸出哪個包的信息,以及輸出位置
log4j.appender.A1=org.apache.log4j.ConsoleAppender //這里指定了日志輸出的第一個位置A1是控制臺ConsoleAppender
/*
*其中辛馆,Log4j提供的appender有以下幾種:
*org.apache.log4j.ConsoleAppender(控制臺)俺陋,
*org.apache.log4j.FileAppender(文件),
*org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個日志文件)昙篙,
*org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時候產(chǎn)生一個新的文件)腊状,
*org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
*
*/
log4j.appender.A1.layout=org.apache.log4j.PatternLayout //指定A1的布局模式
/*
*其中,Log4j提供的layout有以下幾種:
×org.apache.log4j.HTMLLayout(以HTML表格形式布局)苔可,
*org.apache.log4j.PatternLayout(可以靈活地指定布局模式)缴挖,
*org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
*org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時間焚辅、線程映屋、類別等等信息)
*/
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n //指定日志的輸出格式
log4j.appender.R=org.apache.log4j.RollingFileAppender //指定以文件的方式輸出日志
log4j.appender.R.File=c:/sys.html //文件位置
log4j.appender.R.MaxFileSize=500KB //文件最大尺寸
log4j.appender.R.MaxBackupIndex=1 //備份數(shù)
log4j.appender.R.layout=org.apache.log4j.HTMLLayout //文件的格式為Html格式
#log4j.appender.R.layout=org.apache.log4j.PatternLayout?
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
?---------------------------------------------------------------------------------------------------------------------------------------------------
錯誤日志發(fā)送email
1.? 打開log4j.properties文件
2. ?rootLogger加上一個Appender, 即MAIL, 如log4j.rootLogger=ERROR,A1,MAIL
3.? 配置Appender信息,在文件的末尾加上以下部分
# Configuration for receiving e-mails when ERROR messages occur.
#自定義的Appender
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
#日志的錯誤級別
log4j.appender.MAIL.Threshold=ERROR?
#緩存文件大小,日志達(dá)到512K時發(fā)送Email
log4j.appender.MAIL.BufferSize=512
#發(fā)件人
log4j.appender.MAIL.From=test@163.com
#發(fā)送郵件的服務(wù)器
log4j.appender.MAIL.SMTPHost=smtp.163.com
#郵件的標(biāo)題
log4j.appender.MAIL.Subject=Log4J Message
#日志郵件的接收者
log4j.appender.MAIL.To=test@163.com
#日志PatternLayout
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
#日志的格式
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
以上文件皆測試通過同蜻,如不通過請查看自己的email發(fā)送環(huán)境.
----------------------------------------------------------------------------------------------------------------------------------------------------
查看了SMTPAppender.java的源代碼棚点,才發(fā)現(xiàn)Log4J缺省提供的SMTPAppender并不支持SMTP的認(rèn)證功能。難道現(xiàn)在匿名的SMTP郵件服務(wù)器很多嗎湾蔓?我手頭的是Log4J的 1.2.8版本瘫析,去logging.apache.org看,發(fā)現(xiàn)已經(jīng)有新的版本了: 1.2.11,呵呵贬循,竊喜咸包。這樣的簡單、基本的需求Log4J開發(fā)組應(yīng)該已經(jīng)添加上了吧杖虾。
下載烂瘫、查看,再次失望之極奇适!
看來只有自己動手添加了坟比。本來應(yīng)該重新定義一個名字,算做一個自定義Appender吧滤愕,但為了使我很多應(yīng)用中的log4j.properties不用修改過多温算,就直接在原來的SMTPAppender.java上做了修改。另外一個更重要的原因是:
??? 我認(rèn)為:這是一個基本的间影、必須的SMTPAppender應(yīng)該具有的功能注竿。
主要在SMTPAppender.java中添加了如下代碼:
a. 添加實(shí)例變量
? private String smtpUsername;
? private String smtpPassword;
b. 將 activateOptions() 方法中的
Session session = Session.getInstance(props, null);
修改為:
1.2. Log4j簡介
在強(qiáng)調(diào)可重用組件開發(fā)的今天,除了自己從頭到尾開發(fā)一個可重用的日志操作類外魂贬,Apache為我們提供了一個強(qiáng)有力的日志操作包-Log4j巩割。
Log4j是Apache的一個開放源代碼項(xiàng)目,通過使用Log4j付燥,我們可以控制日志信息輸送的目的地是控制臺宣谈、文件、GUI組件键科、甚至是套接口服務(wù) 器闻丑、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等勋颖;我們也可以控制每一條日志的輸出格式嗦嗡;通過定義每一條日志信息的級別,我們能夠更加細(xì)致地控制日志的生成過程饭玲。最令人感興趣的就 是侥祭,這些可以通過一個配置文件來靈活地進(jìn)行配置,而不需要修改應(yīng)用的代碼茄厘。
此外矮冬,通過Log4j其他語言接口,您可以在C次哈、C+ +胎署、.Net、PL/SQL程序中使用Log4j窑滞,其語法和用法與在Java程序中一樣琼牧,使得多語言分布式系統(tǒng)得到一個統(tǒng)一一致的日志組件模塊径筏。而且,通 過使用各種第三方擴(kuò)展障陶,您可以很方便地將Log4j集成到J2EE、JINI甚至是SNMP應(yīng)用中聊训。
本文介紹的Log4j版本是 1.2.3抱究。作者試圖通過一個簡單的客戶/服務(wù)器Java程序例子對比使用與不使用Log4j 1.2.3的差別,并詳細(xì)講解了在實(shí)踐中最常使用Log4j的方法和步驟带斑。在強(qiáng)調(diào)可重用組件開發(fā)的今天鼓寺,相信Log4j將會給廣大的設(shè)計(jì)開發(fā)人員帶來方 便。加入到Log4j的隊(duì)伍來吧勋磕!