一:Log4j的組件介紹
A:)Log4j的三個(gè)重要組件——?Loggers,?Appenders,?Layouts?
這三個(gè)組件協(xié)同的工作,使得開(kāi)發(fā)者能夠依據(jù)信息類(lèi)別和級(jí)別去紀(jì)錄信息,并能夠
運(yùn)行期間,控制信息記錄的方式已經(jīng)日志存放地點(diǎn)。?
B:)記錄器層次(Logger?hierarchy)?
幾乎任何紀(jì)錄日志的API得功能都超越了簡(jiǎn)單的System.out.print語(yǔ)句。允許有選
擇控制的輸出日志信息,也就是說(shuō),某的時(shí)候,一些日志信息允許輸出,而另一
些則不允許輸出。這就假設(shè)日志紀(jì)錄信息之間是有分別的,根據(jù)開(kāi)發(fā)者自己定義
的選擇標(biāo)準(zhǔn),可以對(duì)日志信息加以分類(lèi)。?
紀(jì)錄器的命名是依據(jù)實(shí)體的。它有兩個(gè)獨(dú)特點(diǎn):
(1)總是存在的
(2)能夠被重新找回。可以通過(guò)訪(fǎng)問(wèn)類(lèi)的靜態(tài)方法?Logger.getRootLogger?重新得到。
其他的紀(jì)錄器通過(guò)訪(fǎng)問(wèn)靜態(tài)方法?Logger.getLogger?被實(shí)例話(huà)或被得到,這個(gè)方法將希
望獲得的記錄器的名稱(chēng)作為參數(shù)。一些Logger類(lèi)的方法描述如下:?
public?class?Logger?{?
//?Creation?&?retrieval?methods:?
public?static?Logger?getRootLogger();?
public?static?Logger?getLogger(String?name);?
//?printing?methods:?
public?void?debug(Object?message);?
public?void?info(Object?message);?
public?void?warn(Object?message);?
public?void?error(Object?message);?
public?void?fatal(Object?message);?
//?generic?printing?method:?
public?void?log(Level?l,?Object?message);?
}?
記錄器被賦予級(jí)別,這里有一套預(yù)定的級(jí)別標(biāo)準(zhǔn):DEBUG,?INFO,?WARN,?ERROR?and?FATAL?,
這些是在?org.apache.log4j.Level?定義的。你可以通過(guò)繼承Level類(lèi)定義自己的級(jí)別標(biāo)準(zhǔn),
雖然并不鼓勵(lì)這么做。?
如果給定的記錄器沒(méi)有被賦予級(jí)別,則其會(huì)從離其最近的擁有級(jí)別的ancestor處繼承得到。
如果ancestor也沒(méi)有被賦予級(jí)別,那么就從根記錄器繼承。所以通常情況下,為了讓所有
的記錄器最終都能夠被賦予級(jí)別,跟記錄器都會(huì)被預(yù)先設(shè)定級(jí)別的。比如我們?cè)诓僮鱬roperties
文件中,會(huì)寫(xiě)這么一句:log4j.rootLogger=DEBUG,?A1?。實(shí)際上就這就指定了root?Logger和
root?Logger?level。
****注意:Logger?level的設(shè)定使得做Logger是有選擇,如果設(shè)定為L(zhǎng)OG_LEVEL,則Logger?level
在LOG_LEVEL以下的都將進(jìn)行輸出。最低優(yōu)先級(jí)為DEBUG.最高為FATAL.
#FATAL?0?
#ERROR?3?
#WARN?4?
#INFO?6?
#DEBUG?7?
Appenders?
Log4j允許記錄信息被打印到多個(gè)輸出目的地,一個(gè)輸出目的地叫做Appender。目前的Log4j
存在的輸出目的地包括:控制臺(tái)(Console),文件(File),GUI?Componennt,Remote?Socket
Server,JMS,NT?Event?Logger,and?Remote?Unix?Syslog?daemons。?
多個(gè)Appender可以綁定到一個(gè)記錄器上(Logger)。?
通過(guò)方法?addAppender(Logger.addAppender)?可以將一個(gè)Appender附加到一個(gè)記錄器上。
每一個(gè)有效的發(fā)送到特定的記錄器的記錄請(qǐng)求都被轉(zhuǎn)送到那個(gè)與當(dāng)前記錄器所綁定的Appender上。
(Each?enabled?logging?request?for?a?given?logger?will?be?forwarded?to?all?the?appenders
in?that?logger?as?well?as?the?appenders?higher?in?the?hierarchy),換句話(huà)說(shuō),Appender
的繼承層次是附加在記錄器繼承層次上的。舉個(gè)例子:如果一個(gè)Console?Appender被綁定到根記錄器
(root?Logger),那么所有的記錄請(qǐng)求都可以至少被打印到Console。另外,把一個(gè)file?Appender
綁定到記錄器C,那么針對(duì)記錄器C(或C的子孫)的記錄請(qǐng)求都可以至少發(fā)送到Console?Appender
和file?Appender。當(dāng)然這種默認(rèn)的行為方式可以跟改,通過(guò)設(shè)定記錄器的additivity?flag
(Logger.setAdditivity)為false,從而可以使得Appender的不再具有可加性(Additivity)。?
下面簡(jiǎn)要介紹一下Appender?Additivity。?
Appender?Additivity:記錄器C所記錄的日志信息將被發(fā)送到與記錄器C以及其祖先(ancestor)
所綁定的所有Appender。?但是,如果記錄器C的祖先,叫做P,它的additivity?flag被設(shè)定為
false。那么,記錄信息仍然被發(fā)送到與記錄器C及其祖先,但只到達(dá)P這一層次,包括P在內(nèi)的
記錄器的所有Appender。但不包括P祖先的。通常,記錄器的additivity?flag的被設(shè)置為true。?
Layouts?
這一塊主要是介紹輸出格式的。PatternLayout,Log4j標(biāo)準(zhǔn)的分配器,可以讓開(kāi)發(fā)者依照
conversion?patterns去定義輸出格式。Conversion?patterns有點(diǎn)像c語(yǔ)言的打印函數(shù)。?
參看配置文件的java?properties,如下面的兩行:?
log4j.appender.A1.layout=org.apache.log4j.PatternLayout?
log4j.appender.A1.layout.ConversionPattern=%d?%-5p?[%t]?%C{2}?(%F:%L)?-?%m%n?
第一行就指定了分配器,第二行則指定了輸出的格式。?
有關(guān)輸出格式的定義可以參考/org/apache/log4j/PatternLayout.html?
二:配置?
A:)在Web?Application?中使用log4j?
Step?1:?
配置log4j配置文件?
log4j.properties
=========================?
#?Set?root?logger?level?to?DEBUG?and?its?only?appender?to?A1?
#log4j中有五級(jí)logger?
#FATAL?0?
#ERROR?3?
#WARN?4?
#INFO?6?
#DEBUG?7?
log4j.rootLogger=DEBUG,?A1?
#這一句設(shè)置以為著所有的log都輸出
#如果為log4j.rootLogger=WARN,?A1?則意味著只有WARN,ERROR,FATAL
#被輸出,DEBUG,INFO將被屏蔽掉.
#?A1?is?set?to?be?a?ConsoleAppender.?
#log4j中Appender有幾層?
#ConsoleAppender輸出到控制臺(tái)?
log4j.appender.A1=org.apache.log4j.ConsoleAppender?
#?A1?uses?PatternLayout.?
log4j.appender.A1.layout=org.apache.log4j.PatternLayout?
#輸出格式?具體查看log4j?javadoc?org.apache.log4j.PatternLayout?
#d?時(shí)間?....?
log4j.appender.A1.layout.ConversionPattern=%-4r?[%t]?%-5p?%c?%x?-?%m%n?
================================另外一種配置?
log4j.rootLogger=debug,?stdout,?R?
log4j.appender.stdout=org.apache.log4j.ConsoleAppender?
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout?
#?Pattern?to?output?the?caller's?file?name?and?line?number.?
log4j.appender.stdout.layout.ConversionPattern=%5p?[%t]?(%F:%L)?-?%m%n?
#R?輸出到文件?
log4j.appender.R=org.apache.log4j.RollingFileAppender?
log4j.appender.R.File=example.log?
log4j.appender.R.MaxFileSize=100KB?
#?Keep?one?backup?file?
log4j.appender.R.MaxBackupIndex=1?
log4j.appender.R.layout=org.apache.log4j.PatternLayout?
log4j.appender.R.layout.ConversionPattern=%p?%t?%c?-?%m%n?
Step?2:寫(xiě)啟動(dòng)的Servlet?
public?class?InitServlet?extends?HttpServlet?{?
public?void?init()?{?
ServletContext?sct?=?getServletContext();?
String?prefix?=?sct.getRealPath("/");?
//log4j?配置文件存放目錄?
System.out.println("[....Log4j]:?The?Root?Path:?"?+?prefix);?
System.out.println("[....Log4j]:?InitServlet?init?start...");?
String?file?=?getInitParameter("log4j");?
//log4j?配置文件?
if?(file?!=?null)?{?
PropertyConfigurator.configure(prefix?+?file);?
//根據(jù)配置初始化log4j?
}?
System.out.println("[....Log4j]:?InitServlet?Init?Sucess...");?
}?
public?void?doGet(HttpServletRequest?req,?HttpServletResponse?res)?{?
}?
public?void?doPost(HttpServletRequest?req,?HttpServletResponse?res)?{?
}?
}?
B:在一般的IDE中使用log4j,因?yàn)槭褂胠og4j需要做一些初始化,在Web?Application?
中這一部分初始化是有AppServer?啟動(dòng)是加載的。在IDE中,則我們?cè)谑褂胠og4j?
之前需要自己配置一下。?有兩種方式配置log4j初始化,一種是通過(guò)加載配置文件。
另外一種是配置一個(gè)Appender.
如下文件:?
public?final?class?Lo4jTest?{?
private?static?String?CLASS_NAME?=?"com.bingo.test.Lo4jTest";?
private?static?Logger?log?=?Logger.getLogger(CLASS_NAME);?
//在Web?Application?中下面的pattern是在log4j的配置文件中配置的。?
//現(xiàn)在我們手動(dòng)配置?
private?static?String?pattern="%-4r?[%-t]?[%p]?[%c]?[%x]?-?[%m]%n";?
private?static?String?pattern2="%-d{yyyy-MM-dd?HH:mm:ss}?[%c]-[%p]?%m%n";?
//設(shè)置輸出層?
private?static?String?profile="e:/Xml/log4j.properties";?
//根據(jù)配置文件做配置
private?static?ConsoleAppender?consAppender?=?
new?ConsoleAppender(?
new?PatternLayout(pattern2));?
public?static?void?main(String[]?args)?{?
//配置log4j?
BasicConfigurator.configure(consAppender);?
//?void?configure(Appender?appender);?
//?void?configure();?
//配置時(shí)log4j提供了兩種方式?
//后一種比較簡(jiǎn)單,輸出的信息不夠詳細(xì)?
//我們可以使用前一種輸出我們希望的格式?
//PropertyConfigurator.configure(profile);
//上面的是根據(jù)配置文件做配置
log.debug("Log4j?Debug.");?
log.error("Log4j?Error.");?
log.warn("Log4j?Warn.");?
log.info("Log4j?Info.");?
log.fatal("Log4j?Fatal.");?
//修改log4j.properteis的設(shè)置如下一行,把DEBUG?修改為ERROR,INFO,WARN,FATAL
//將會(huì)輸出不同的結(jié)果
//log4j.rootLogger=DEBUG,?A1?
}?
}?
//使用pattern2上面的輸出結(jié)果如下?
2002-08-30?13:49:09?[com.bingo.test.Lo4jTest]-[DEBUG]?Log4j?Debug.?
2002-08-30?13:49:09?[com.bingo.test.Lo4jTest]-[ERROR]?Log4j?Error.?
2002-08-30?13:49:09?[com.bingo.test.Lo4jTest]-[INFO]?Log4j?Info.?
2002-08-30?13:49:09?[com.bingo.test.Lo4jTest]-[FATAL]?Log4j?Fatal.?
//假如我們使用pattern輸出如下:?
0?[main]?[DEBUG]?[com.bingo.test.Lo4jTest]?[]?-?[Log4j?Debug.]?
0?[main]?[ERROR]?[com.bingo.test.Lo4jTest]?[]?-?[Log4j?Error.]?
0?[main]?[INFO]?[com.bingo.test.Lo4jTest]?[]?-?[Log4j?Info.]?
0?[main]?[FATAL]?[com.bingo.test.Lo4jTest]?[]?-?[Log4j?Fatal.]?
三:使用log4j?
在實(shí)際使用過(guò)程中其實(shí)非常簡(jiǎn)單?
1:)如下定義log,在log4j1.2以前使用Category,log4j1.2以后使用Logger代替?
private?static?String?CLASS_NAME?=?"com.bingo.test.Lo4jTest";?
//log4j1.2?
private?static?Logger?log?=?Logger.getLogger(CLASS_NAME);?
//lo4j1.2以前?
private?static?Category?log?=Category.getInstance(CLASS_NAME);?
//取得一個(gè)Category?or?Logger有幾種方式,根據(jù)自己需要使用?
2:)寫(xiě)日志?
log.debug("Log4j?Debug.");?
log.info("Log4j?Info.");?
log.warn("Log4j?Warn.");?
log.error("Log4j?Error.");?
log.fatal("Log4j?Fatal.");?
//void?debug(Object?message)?
//Log?a?message?object?with?the?DEBUG?level.?
//void?debug(Object?message,?Throwable?t)?
//Log?a?message?object?with?the?DEBUG?level?including?the?
//stack?trace?of?the?Throwable?t?passed?as?parameter.?
四:注意事項(xiàng)?
1:在具體使用中注意不同的信息使用不同的log方式,選擇debug,error,warn,?
info,fatal中的一種,以后可以根據(jù)需要屏蔽部分輸出?
2:開(kāi)發(fā)過(guò)程中盡量輸出到控制臺(tái),運(yùn)行過(guò)程中則修改配置使其輸出到文件.?
3:定義log盡量使用文件名作為參數(shù),這樣容易查找錯(cuò)誤.
log4j.properties?使用
一.參數(shù)意義說(shuō)明
輸出級(jí)別的種類(lèi)
ERROR、WARN、INFO、DEBUG
ERROR?為嚴(yán)重錯(cuò)誤?主要是程序的錯(cuò)誤
WARN?為一般警告,比如session丟失
INFO?為一般要顯示的信息,比如登錄登出
DEBUG?為程序的調(diào)試信息
配置日志信息輸出目的地
log4j.appender.appenderName?=?fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppender(控制臺(tái))
2.org.apache.log4j.FileAppender(文件)
3.org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件)
4.org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)
5.org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
配置日志信息的格式
log4j.appender.appenderName.layout?=?fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線(xiàn)程、類(lèi)別等等信息)
控制臺(tái)選項(xiàng)
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
Target=System.err:默認(rèn)情況下是:System.out,指定輸出控制臺(tái)
FileAppender?選項(xiàng)
Threshold=DEBUF:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
RollingFileAppender?選項(xiàng)
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
MaxFileSize=100KB:?后綴可以是KB,?MB?或者是?GB.?在日志文件到達(dá)該大小時(shí),將會(huì)自動(dòng)滾動(dòng),即將原來(lái)的內(nèi)容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以產(chǎn)生的滾動(dòng)文件的最大數(shù)。
log4j.appender.A1.layout.ConversionPattern=%-4r?%-5p?%d{yyyy-MM-dd?HH:mm:ssS}?%c?%m%n
日志信息格式中幾個(gè)符號(hào)所代表的含義:
?-X號(hào):?X信息輸出時(shí)左對(duì)齊;
?%p:?輸出日志信息優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL,
?%d:?輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy?MMM?dd?HH:mm:ss,SSS},輸出類(lèi)似:2002年10月18日?22:10:28,921
?%r:?輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
?%c:?輸出日志信息所屬的類(lèi)目,通常就是所在類(lèi)的全名
?%t:?輸出產(chǎn)生該日志事件的線(xiàn)程名
?%l:?輸出日志事件的發(fā)生位置,相當(dāng)于%C.%M(%F:%L)的組合,包括類(lèi)目名、發(fā)生的線(xiàn)程,以及在代碼中的行數(shù)。舉例:Testlog4.main?(TestLog4.java:10)
?%x:?輸出和當(dāng)前線(xiàn)程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像java?servlets這樣的多客戶(hù)多線(xiàn)程的應(yīng)用中。
?%%:?輸出一個(gè)"%"字符
?%F:?輸出日志消息產(chǎn)生時(shí)所在的文件名稱(chēng)
?%L:?輸出代碼中的行號(hào)
?%m:?輸出代碼中指定的消息,產(chǎn)生的日志具體信息
?%n:?輸出一個(gè)回車(chē)換行符,Windows平臺(tái)為"/r/n",Unix平臺(tái)為"/n"輸出日志信息換行
?可以在%與模式字符之間加上修飾符來(lái)控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如:
?1)%20c:指定輸出category的名稱(chēng),最小的寬度是20,如果category的名稱(chēng)小于20的話(huà),默認(rèn)的情況下右對(duì)齊。
?2)%-20c:指定輸出category的名稱(chēng),最小的寬度是20,如果category的名稱(chēng)小于20的話(huà),"-"號(hào)指定左對(duì)齊。
?3)%.30c:指定輸出category的名稱(chēng),最大的寬度是30,如果category的名稱(chēng)大于30的話(huà),就會(huì)將左邊多出的字符截掉,但小于30的話(huà)也不會(huì)有空格。
?4)%20.30c:如果category的名稱(chēng)小于20就補(bǔ)空格,并且右對(duì)齊,如果其名稱(chēng)長(zhǎng)于30字符,就從左邊較遠(yuǎn)輸出的字符截掉。
二.文件配置Sample1
log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=INFO,A1,R
#?ConsoleAppender?輸出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd?HH:mm:ss,SSS}?[%c]-[%p]?%m%n
#?File?輸出?一天一個(gè)文件,輸出路徑可以定制,一般在根路徑下
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
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
文件配置Sample2
下面給出的Log4J配置文件實(shí)現(xiàn)了輸出到控制臺(tái),文件,回滾文件,發(fā)送日志郵件,輸出到數(shù)據(jù)庫(kù)日志表,自定義標(biāo)簽等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
#?Console?Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework]?%d?-?%c?-%-4r?[%t]?%-5p?%c?%x?-?%m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]?n%c[CATEGORY]%n%m[MESSAGE]%n%n
#####################
#?File?Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework]?%d?-?%c?-%-4r?[%t]?%-5p?%c?%x?-?%m%n
#?Use?this?layout?for?LogFactor?5?analysis
########################
#?Rolling?File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework]?%d?-?%c?-%-4r?[%t]?%-5p?%c?%x?-?%m%n
####################
#?Socket?Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
#?Set?up?for?Log?Facter?5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
########################
#?Log?Factor?5?Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
########################
#?SMTP?Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J?Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework]?%d?-?%c?-%-4r?[%t]?%-5p?%c?%x?-?%m%n
########################
#?JDBC?Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT?INTO?LOG4J?(Message)?VALUES?('[framework]?%d?-?%c?-%-4r?[%t]?%-5p?%c?%x?-?%m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework]?%d?-?%c?-%-4r?[%t]?%-5p?%c?%x?-?%m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
###################
#自定義Appender
###################
log4j.appender.im?=?net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host?=?mail.cybercorlin.net
log4j.appender.im.username?=?username
log4j.appender.im.password?=?password
log4j.appender.im.recipient?=?corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern?=[framework]?%d?-?%c?-%-4r?[%t]?%-5p?%c?%x?-?%m%n
三.高級(jí)使用
實(shí)驗(yàn)?zāi)康模??1.把FATAL級(jí)錯(cuò)誤寫(xiě)入2000NT日志
?2.?WARN,ERROR,F(xiàn)ATAL級(jí)錯(cuò)誤發(fā)送email通知管理員
?3.其他級(jí)別的錯(cuò)誤直接在后臺(tái)輸出
實(shí)驗(yàn)步驟:
?輸出到2000NT日志
?1.把Log4j壓縮包里的NTEventLogAppender.dll拷到WINNT/SYSTEM32目錄下
?2.寫(xiě)配置文件log4j.properties
#?在2000系統(tǒng)日志輸出
?log4j.logger.NTlog=FATAL,?A8
?#?APPENDER?A8
?log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
?log4j.appender.A8.Source=JavaTest
?log4j.appender.A8.layout=org.apache.log4j.PatternLayout
?log4j.appender.A8.layout.ConversionPattern=%-4r?%-5p?[%t]?%37c?%3x?-?%m%n
3.調(diào)用代碼:
?Logger?logger2?=?Logger.getLogger("NTlog");?//要和配置文件中設(shè)置的名字相同
?logger2.debug("debug!!!");
?logger2.info("info!!!");
?logger2.warn("warn!!!");
?logger2.error("error!!!");
?//只有這個(gè)錯(cuò)誤才會(huì)寫(xiě)入2000日志
?logger2.fatal("fatal!!!");
發(fā)送email通知管理員:
?1.?首先下載JavaMail和JAF,
??http://java.sun.com/j2ee/ja/javamail/index.html
??http://java.sun.com/beans/glasgow/jaf.html
?在項(xiàng)目中引用mail.jar和activation.jar。
?2.?寫(xiě)配置文件
?#?將日志發(fā)送到email
?log4j.logger.MailLog=WARN,A5
?#??APPENDER?A5
?log4j.appender.A5=org.apache.log4j.net.SMTPAppender
?log4j.appender.A5.BufferSize=5
?log4j.appender.A5.To=chunjie@yeqiangwei.com
?log4j.appender.A5.From=error@yeqiangwei.com
?log4j.appender.A5.Subject=ErrorLog
?log4j.appender.A5.SMTPHost=smtp.263.net
?log4j.appender.A5.layout=org.apache.log4j.PatternLayout
?log4j.appender.A5.layout.ConversionPattern=%-4r?%-5p?[%t]?%37c?%3x?-?%m%n
?3.調(diào)用代碼:
?//把日志發(fā)送到mail
?Logger?logger3?=?Logger.getLogger("MailLog");
?logger3.warn("warn!!!");
?logger3.error("error!!!");
?logger3.fatal("fatal!!!");
在后臺(tái)輸出所有類(lèi)別的錯(cuò)誤:
?1.?寫(xiě)配置文件
?#?在后臺(tái)輸出
?log4j.logger.console=DEBUG,?A1
?#?APPENDER?A1
?log4j.appender.A1=org.apache.log4j.ConsoleAppender
?log4j.appender.A1.layout=org.apache.log4j.PatternLayout
?log4j.appender.A1.layout.ConversionPattern=%-4r?%-5p?[%t]?%37c?%3x?-?%m%n
?2.調(diào)用代碼
?Logger?logger1?=?Logger.getLogger("console");
?logger1.debug("debug!!!");
?logger1.info("info!!!");
?logger1.warn("warn!!!");
?logger1.error("error!!!");
?logger1.fatal("fatal!!!");
--------------------------------------------------------------------
?全部配置文件:log4j.properties
?#?在后臺(tái)輸出
?log4j.logger.console=DEBUG,?A1
?#?APPENDER?A1
?log4j.appender.A1=org.apache.log4j.ConsoleAppender
?log4j.appender.A1.layout=org.apache.log4j.PatternLayout
?log4j.appender.A1.layout.ConversionPattern=%-4r?%-5p?[%t]?%37c?%3x?-?%m%n
#?在2000系統(tǒng)日志輸出
?log4j.logger.NTlog=FATAL,?A8
?#?APPENDER?A8
?log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
?log4j.appender.A8.Source=JavaTest
?log4j.appender.A8.layout=org.apache.log4j.PatternLayout
?log4j.appender.A8.layout.ConversionPattern=%-4r?%-5p?[%t]?%37c?%3x?-?%m%n
#?將日志發(fā)送到email
?log4j.logger.MailLog=WARN,A5
?#??APPENDER?A5
?log4j.appender.A5=org.apache.log4j.net.SMTPAppender
?log4j.appender.A5.BufferSize=5
?log4j.appender.A5.To=chunjie@yeqiangwei.com
?log4j.appender.A5.From=error@yeqiangwei.com
?log4j.appender.A5.Subject=ErrorLog
?log4j.appender.A5.SMTPHost=smtp.263.net
?log4j.appender.A5.layout=org.apache.log4j.PatternLayout
?log4j.appender.A5.layout.ConversionPattern=%-4r?%-5p?[%t]?%37c?%3x?-?%m%n
全部代碼:Log4jTest.java
?
/*
??*?創(chuàng)建日期?2003-11-13
??*/
?package?edu.bcu.Bean;
?import?org.apache.log4j.*;
?//import?org.apache.log4j.nt.*;
?//import?org.apache.log4j.net.*;
?/**
??*?@author?yanxu
??*/
?public?class?Log4jTest
?{
??public?static?void?main(String?args[])
??{
???PropertyConfigurator.configure("log4j.properties");
???//在后臺(tái)輸出
???Logger?logger1?=?Logger.getLogger("console");
???logger1.debug("debug!!!");
???logger1.info("info!!!");
???logger1.warn("warn!!!");
???logger1.error("error!!!");
???logger1.fatal("fatal!!!");
//在NT系統(tǒng)日志輸出
???Logger?logger2?=?Logger.getLogger("NTlog");
???//NTEventLogAppender?nla?=?new?NTEventLogAppender();
???logger2.debug("debug!!!");
???logger2.info("info!!!");
???logger2.warn("warn!!!");
???logger2.error("error!!!");
???//只有這個(gè)錯(cuò)誤才會(huì)寫(xiě)入2000日志
???logger2.fatal("fatal!!!");
//把日志發(fā)送到mail
???Logger?logger3?=?Logger.getLogger("MailLog");
???//SMTPAppender?sa?=?new?SMTPAppender();
???logger3.warn("warn!!!");
???logger3.error("error!!!");
???logger3.fatal("fatal!!!");
??}
?}