另外,這股風潮也迫使 JCP 制訂了 Logging Standard APIs 放在 J2SE 1.4 裡頭,不過,畫虎不成反成犬,倒是 JDK14 Logging 的敗筆,這又是另話了。 在進入 Log4j 殿堂之前,我們可以先到 apache 的 logging 專案,下載 log4j 的 Binary 檔案 (https://logging.apache.org/log4j/docs/) ,其實,裡面也有許多文件可以參考,除了基本的教學之外,可以看一下 vipan singla 寫的 "Don't Use System.out.println",為什麼不要用 System.out.println 呢,因為當你希望查看一些比較細膩的資料訊息,例如 SQL 命令內容,該怎麼去做呢?重新編譯程式嗎?還是該開始就寫很多浪費 I/O 的資源呢? 首先,我們可以看到,我們該如何讓一些資訊隱藏起來,等到要用的時候再把她叫出來,這就是 Log 等級 (Level) 的重要性。我們可以設定 Logger(Log 記錄器)等級為 DEBUG、INFO、WARN、ERROR、 FATAL。透過 categories 的設定與 levels 的應用,log4j 可以產生 Log Filter,他會根據現在目錄的屬性,來決定是否針對此訊息紀錄下來,還是忽略之。例如:
Logger 的階層名稱 | 設定的Level | 有效會輸出的 Level
root | INFO | INFO
x | DEBUG | DEBUG
x.y | none | DEBUG
x.y.z | WARN | WARN
接著,我們就要思考,輸出的方式是檔案呢?還是資料庫?還是 FATAL 錯誤發生時給我一封 Email?這些輸出的方式,我們稱之為 Appender,也就是 Log 的附加器。
我們可以指定想要使用的 Appender 為何,只要該 Appender 有確實 implements Appender 這個 interface。例如我常用的 ConsoleAppender, DailyRollingFileAppender, 或是 extension 中 的 JDBCAppender 都是非常好用的。
最後,我們要考慮的就是輸出的格式 (Layout) 為何?通常都會採用 PatternLayout 並且設定該 Pattern 屬性,這方法彈性較大,或是 直接使用 XMLLayout 可以透過 sax 或 dom 的方法來取得必要的欄 位。PatternLayout 定義了很多 %[alpha-code] ,詳細可以在
https://logging.apache.org/log4j/docs/api/org/apache/log4j/ PatternLayout.html 查詢使用方式。
當我們都已經準備好以上的資訊時,我們就要開始設定 log4j.properties 在 classes 之下即可。裡面可寫,例如:
log4j.debug=true
log4j.rootLogger=debug, TEST
log4j.appender.TEST=org.apache.log4j.FileAppender
log4j.appender.TEST.File=${user.home}/test.log
log4j.appender.TEST.layout=org.apache.log4j.PatternLayout
log4j.appender.TEST.layout.ConversionPattern=%p %t %c - %m%n
也可以設定多個 Appender.
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
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
當你上線的時候,只需要調整輸出的 level ,就可以得到更好的效能,或是在問題發生的時候,降低 level 讓更多資訊呈現出來,這麼方便的小工具,實在不能錯過 。