From Gossip@Openhome

Java Gossip: Handler、Formatter

Logger預設的Handler是ConsolerHandler,而ConsolerHandler的訊息等級是INFO,這可以在logging.properties下看到:
handlers= java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = INFO
 

J2SE 提供了五個預設的 Handler:
  • ConsoleHandler
以 System.err 輸出記錄。
  • FileHandler
將訊息輸出至檔案
  • StreamHandler
以 OutputStream 輸出記錄。
  • SocketHandler
將訊息透過Socket傳送至遠端主機。
  • MemoryHandler
將訊息暫存在記憶體中。

下面這個例子示範如何使用FileHandler將訊息輸出至檔案中:

  • HandlerDemo.java
package onlyfun.caterpillar;

import java.io.IOException;
import java.util.logging.*;

public class HandlerDemo {
public static void main(String[] args) {
Logger logger = Logger.getLogger("handlerDemo");

try {
FileHandler fileHandler =
new FileHandler("%h/myLogger.log");
logger.addHandler(fileHandler);
logger.info("測試訊息");
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

執行的結果會在主控台顯示訊息,並將結果輸出至檔案中,在指定輸出的檔案名稱時,我們可以使用%h來表示使用者的home目 錄,您還可以使用%t取得系統的暫存目錄,或者是加入%g,例如可以設定為"%h/myLogger%g.log"表示自動為檔案名稱編號,檔案輸出的內 容如下:
<?xml version="1.0" encoding="x-windows-950"
  standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
   <date>2005-02-03T19:49:39</date>
   <millis>1107431379203</millis>
   <sequence>0</sequence>
   <logger>handlerDemo</logger>
   <level>INFO</level>
   <class>onlyfun.caterpillar.HandlerDemo</class>
   <method>main</method>
   <thread>10</thread>
   <message>測試訊息</message>
</record>
</log>
 

Handler負責輸出訊息的目的地,而輸出的格式則是由Formatter控制,預設上FileHandler的輸出格式是XML格式,輸出格式是由Formatter來控制,例如FileHandler的預設格式是XMLFormatter,而ConsolerHandler的預設格式是SimpleFormatter,您可以使用Handler的setFormatter()方法來設定訊息的輸出格式,例如:
fileHandler.setFormatter(new SimpleFormatter());
 
如果FileHandler設定為SimpleFormatter,則輸出的記錄檔內容與主控台看到的就是相同的內容。