Posted on 2006-01-26 18:09
-=Kinohl=- 閱讀(2822)
評論(2) 編輯 收藏 所屬分類:
讀書筆記
Log4j 簡單配置
***************************************
關(guān)鍵字:Log4j
難易度:簡單
軟件版本:apache-log4j-1.2.9
時間:2006-01-26
Author:Kino
***************************************
呵呵 快過年了。眼看身邊的朋友一個一個離開,踏上歸途,心里不免有些淡淡的憂傷。為了消磨時間,寫寫文章也和久違的大家聊聊。
這里先祝愿各位朋友新春快樂。在狗年旺、旺、旺旺旺。
切入正題吧。大名鼎鼎的Log4j我也理解得不深,這里采用假設(shè)的問答方式介紹吧。
Q:Log4j是個什么東西?
A:Log4j應(yīng)該叫做 Log for java吧,是ApacheGroup旗下的明星項目,已經(jīng)應(yīng)用在很多方面了。同類的還有針對c c++等的log4c log4XXX之類。請自己看鏈接:
Q:Log4j到底是怎么被應(yīng)用得?
A:這就要從結(jié)構(gòu)上說了,首先我們應(yīng)用的并不是Log4j而是Jakarta-Commons-logging,但是這只是一個interface包沒有具體的實現(xiàn)(其實是有的,叫做SampleLog弱但是快)。所以在大火的source里你只需要面向Logging編程而無須關(guān)心到底是如何生成的。因為Logging項目支持很多實現(xiàn)并不一定是Log4j。還有JDK的Log也行啊。那我們要做的就是 配置 Log4j到系統(tǒng)就好了。
Q:Log4j到底要配置什么東西,才能被系統(tǒng)識別?
A:2個:Jar包 和 log4j配置文件。 Jar我就不說了。現(xiàn)在來說Log4j配置文件。這個文件可以隨意命名,默認(rèn)的文件是 log4j.properties 。放在你的src根目錄下就好。比如 你的source的catagory是com.yourcompany.xx那么放在和com并列的目錄下就好。
Q:如果我不想用默認(rèn)的log4j.properties 我應(yīng)該怎么定義,怎么做?
A:那就使用下邊的命令定義:
System.setProperty(""); -_-! 具體內(nèi)容想不起來了,留言中補充吧。
如果你是Struts工程或者Web工程,需要做一個sevlet把這段代碼載入。重載ActionServlet的init方法就好。
Q:這個文件如何定義?
A:如下例。(具體的可以查閱JavaDoc)
### direct log messages to console ###
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss:SSS} %-5p %m (%F:%L) [%t]%n
### direct messages to file gm_web.log ###
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=../logs/gm_web.log
log4j.appender.FILE.MaxFileSize=1000KB
log4j.appender.FILE.MaxBackupIndex=5
log4j.appender.FILE.Append=true
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss:SSS} %-5p %m (%F:%L) [%t]%n
# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=ERROR, CONSOLE, FILE
log4j.logger.com.mycompany.ui=DEBUG, CONSOLE, FILE
XML格式的定義,我就不說了,資料滿天都是。
Q:聽說Log記錄有繼承關(guān)系,那么多Log,效率太低了吧
A:有繼承關(guān)系,對應(yīng)的當(dāng)然就有打破繼承的定義,比如上例。
log4j.rootCategory=ERROR, CONSOLE, FILE
log4j.logger.com.mycompany.ui=DEBUG, CONSOLE, FILE
com.mycompany.ui就繼承了rootCategory的Log記錄級別。但是如果像破除使用additivity
log4j.additivity.com.mycompany.ui=false
就KO了。
Q:log4j.appender.FILE.File=yourlogfile.log 到底給我把Log放哪去了?能改不?
A:如果是Tomcat那就放到bin下邊了。能改啊,bin就是基準(zhǔn)目錄,寫相對路徑就好咯。如上例。
Q:Log4j中ConversionPattern到底都是什么意思,都怎么用???
A: 如下解釋
- [c]/[C] -- 返回用來決定 Class名稱 以及 package路徑(路徑也可是部分的)
- [d] -- 返回時間 可能有各種格式format的時間。
- [F] -- 返回發(fā)出記載Log請求的文件得名字。
- [l] -- 返回生成log事件的調(diào)用者的Location Information。
- [L] -- 返回發(fā)出記載Log請求的行數(shù)。
- [m] -- 返回用戶自己寫的 message。
- [M] -- 返回發(fā)出記載Log請求的方法名稱。
- [n] -- 返回 換行。(依據(jù)平臺不同而不同)
- [p] -- 返回Log事件的優(yōu)先級。
- [r] -- 返回從Application開始到這條Log事件產(chǎn)生之間的時間間隔。(毫秒)
- [t] -- 返回生成Log事件的線程名稱。
- [x] -- 返回與生成Log事件的線程相關(guān)的NDC(內(nèi)嵌特征內(nèi)容)
- [X] -- 返回與生成Log事件的線程相關(guān)的MDC(映射特征內(nèi)容),要KeyofMDC
- 分隔符 -- 空格,可能在left 也可能在 right
Q:ConversionPattern參數(shù)能去哪里參考呢?
A:JavaDoc PatternLayout 類。
http://logging.apache.org/log4j/docs/api-unstable/index.html
Q:Log4j會不會太慢啊,性能如何?
A:這個問題不好回答。反正記錄一條Log大約的時間是20ms 到 400ms吧,根據(jù)你ConversionPattern需要記錄的格式內(nèi)容,以及package catagory的繼承關(guān)系來決定。那么每個pattern到底哪個快哪個慢,哪個超級慢,請看http://logging.apache.org/log4j/docs/api-unstable/index.html??倸w一句話,只要讓log4j給你trace調(diào)用關(guān)系,反射class 就別指望能快,格誰都一樣,是吧。
Q:下班了沒,啰嗦這么多,有問題再問你吧,留下聯(lián)系信息
A:剛下班,還吃了朋友的蛋糕(他本人正在飛機上,哈哈,吃了個獨食),回家咯。討論問題的請留言或者kinoviti@gmail.com QQ:23493713