星期三, 1月 24, 2007

Log4j 筆記 (一)



當我們在做程式 Debug 的時候,最常使用到的方法應該就是把訊息印出來了。在 Java 的話,就是使用 System.out.println(訊息),但是這個方法的缺點就是,速度慢以及當系統要 deploy 的時候,這些 statement 只能全部出現或全部不出現 (All or None) 。


一般來說,一個 logger 需要有底下的幾個功能:

  • 控制哪些 statement 要印或不印
  • 控制可以把 log 紀錄到哪些地方
  • 控制 log 記錄的 layout
Log4J 就是這樣的一套 logger library。具有不同的 Level 以及繼承特性來控制 enable 或 disable logger 是否要印出資料,使用 appender 讓 logger 可以輸出到不同的地方,使用 layouts 控制印出的格式。

Logger4J Level 以及繼承

Log4J 分為五個 Level,DEBUG、INFO、WARN、ERROR、FATAL; 越往右的 Level 等級越高。因此假設你設定現在要呈現的 Level 是 INFO、那只會呈現 WARN、ERROR 以及 FATAL 這三個 Level 的資訊,其他 DEBUG 以及 INFO 都不會出現。

另外 Logger 具有階層層級關係,例如 com 是 com.foo 的 parent,而 com.foo 是 com.foo.bar 的 parent。這個階層關係也隱含了 rule 繼承的關係。例如若 com.foo 沒有設定 logger 的 level,那 com.foo 會繼承自 com 的 logger level,而最上層是 root (所有都繼承自 root)

Logger logger = Logger.getInstance("com.foo");

logger.setLevel(Level.INFO); //設定為 INFO level

Logger barLogger = Logger.getInstance("com.foo.Bar"); // 繼承自 com.foo

// 因為 barLogger 沒有設定自己的 logger level,因此 barLogger 會繼承 logger 的

// level,也就是 INFO level

logger.warn("Low fuel level."); // 會印出資訊,WARN >= INFO

logger.debug("Starting search for nearest gas station."); // 不會印出資訊,INFO > DEBUG

barLogger.info("Located nearest gas station."); // 會印出資訊,INFO >= INFO


barLogger.debug("Exiting gas station search"); // 不會印出資訊,INFO > DEBUG


Appenders

Log4j appenders 是關於紀錄 log 的儲存方式,例如 console、file、SMTP、NT Event log 等等,一個 logger 可以同時把 log 記錄到多個 appenders 上。目前 Log4J 已經內定了不少的 appenders,幾乎可以涵蓋所有的需求了。例如:

  • FileAppender – Write to a log file
  • SocketAppender – Dumps log output to a socket
  • SyslogAppender – Write to the syslog.
  • NTEventLogAppender – Write the logs to the NT Event Log system.
  • RollingFileAppender – After a certain size is reached it will rename the old file and start with a new one.
  • SocketAppender – Dumps log output to a socket
  • SMTPAppender – Send Messages to email
  • JMSAppender – Sends messages using Java Messaging Service

PatternLayouts

透過 pattern layout 控制需要呈現的資訊以及格式,有點類似 C 的 printf function。例如:

%r [%t] %-5p %c - %m%n

可能會列印出底下的訊息:

176 [main] INFO  org.foo.Bar - Located nearest gas station.

%r - 從程式開始到列印該行 statement 所經過的 milliseconds
%t - 執行的 thread 名稱
%p - logger level 名稱
%m - 印出訊息
%n - 換行




沒有留言: