log4j配置詳解(非常詳細(xì))

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á)指定尺寸的時(shí)候產(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í)間、線程、類別等等信息)


打印參數(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?? 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(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)時(shí),我們往往注意的只是異常級別的日志輸出,但是通常所有級別的輸出都是放在一個文件里的,如果日志輸出的級別是BUG!?那就慢慢去找吧。

這時(shí)我們也許會想要是能把異常信息單獨(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)生的時(shí)間、線程、類別等等信息)

log4j.appender.A1.layout=org.apache.log4j.PatternLayout?

#靈活定義輸出格式 具體查看log4j javadoc org.apache.log4j.PatternLayout?

#d 時(shí)間 ....?

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á)指定尺寸的時(shí)候產(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)生的時(shí)間、線程、類別等等信息)

*/

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時(shí)發(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ì)伍來吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容