Login  |  繁體中文
感謝您對「自由軟體鑄造場」的支持與愛護,十多年來「自由軟體鑄造場」受中央研究院支持,並在資訊科學研究所以及資訊科技創新研究中心執行,現已完成階段性的任務。 本網站預計持續維運至 2021年底,網站內容基本上不會再更動。
也紀念我們永遠的朋友 李士傑先生(Shih-Chieh Ilya Li)。
Tech Column 隨時記錄你的 Log

隨時記錄你的 Log

Java Opensources for Web Development Part I:嘗試使用來自 Opensource 的小工具(1)
Lession 3 : 隨時記錄你的 Log 在開發一套複雜的企業系統之時,我們面臨到許多挑戰,尤其是單人單機的運作環境,與多人多工的作業環境,管理與控制是非常不同的。尤其我們在開發除錯的階段,與測試上線的階段,都需要一套完整的 Logging 機制來存查所有的紀錄。Log4j 已經有 10 年左右的歷史了,在 Apache Software License 的推廣之下,許許多多的工程師與許多專案貨系統,大多都以 Log4j 作為 logging 與追蹤 APIs 的基本元件。Log4j也從原本屬於 jakarta 的次專案,提升為 logging 的專案,並且建立其他語言的 Log 機制,如 log4cxx、log4net、log4php 等等。

另外,這股風潮也迫使 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 讓更多資訊呈現出來,這麼方便的小工具,實在不能錯過 。




OSSF Newsletter : 第 60 期 LSM & Ubuntu Installfest 活動預告

Category: Tech Column