ITEEDU

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>

预设上FileHandler的输出格式是XML格式,输出格式是由Formatter来控制,例如FileHandler的预设格式是XMLFormatter,而ConsolerHandler的预设格式是SimpleFormatter,您可以使用Handler的setFormatter()方法来设定讯息的输出格式,例如:

fileHandler.setFormatter(new SimpleFormatter());

如果FileHandler设定为SimpleFormatter,则输出的记录文件内容与主控台看到的就是相同的内容。