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á)指定尺寸的時候產(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ì)伍來吧勋磕!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妈候,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挂滓,更是在濱河造成了極大的恐慌苦银,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赶站,死亡現(xiàn)場離奇詭異幔虏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贝椿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門想括,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烙博,你說我怎么就攤上這事瑟蜈。” “怎么了渣窜?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵铺根,是天一觀的道長。 經(jīng)常有香客問我图毕,道長夷都,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任予颤,我火速辦了婚禮囤官,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛤虐。我一直安慰自己党饮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布驳庭。 她就那樣靜靜地躺著刑顺,像睡著了一般氯窍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹲堂,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天狼讨,我揣著相機(jī)與錄音,去河邊找鬼柒竞。 笑死政供,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朽基。 我是一名探鬼主播布隔,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稼虎!你這毒婦竟也來了衅檀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霎俩,失蹤者是張志新(化名)和其女友劉穎哀军,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體打却,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡排苍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了学密。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淘衙。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腻暮,靈堂內(nèi)的尸體忽然破棺而出彤守,到底是詐尸還是另有隱情,我是刑警寧澤哭靖,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布具垫,位于F島的核電站,受9級特大地震影響试幽,放射性物質(zhì)發(fā)生泄漏筝蚕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一铺坞、第九天 我趴在偏房一處隱蔽的房頂上張望起宽。 院中可真熱鬧,春花似錦济榨、人聲如沸坯沪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腐晾。三九已至叉弦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藻糖,已是汗流浹背淹冰。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巨柒,地道東北人榄棵。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像潘拱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拧略,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容