ITEEDU

Java Gossip: 自订 Formatter

除了XMLFormatter与SimpleFormatter之外,您也可以自订自己的记录输出格式,只要继承抽象类别Formatter,并重新定义其format()方法即可,format()方法会传入一个LogRecord对象作为参数,您可以使用它来取得一些与程序执行有关的信息。

下面这个程序是个简单的示范,自订一个简单的TableFormatter:

TableFormatter.java
package onlyfun.caterpillar;
import java.util.logging.*;
public class TableFormatter extends Formatter {
	public String format(LogRecord logRecord) {
		return
		"LogRecord info: " + logRecord.getSourceClassName() + "\n" +
		"Level\t|\tLoggerName\t|\tMessage\t|\n" +
		logRecord.getLevel() + "\t|\t" +
		logRecord.getLoggerName() + "\t|\t" +
		logRecord.getMessage() + "\t|\n\n";
	}
}

再来就是使用Handler的setFormatter()方法设定Formatter对象,例如:

FormatterDemo.java
package onlyfun.caterpillar;
import java.util.logging.*;
public class FormatterDemo {
	public static void main(String[] args) {
		Logger logger = Logger.getLogger("formatterDemo");
		try {
			for(Handler h : logger.getParent().getHandlers()) {
				if(h instanceof ConsoleHandler) {
					h.setFormatter(new TableFormatter());
				}
			}
			logger.info("测试讯息1");
			logger.warning("测试讯息2");
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}
}

您取得预设的root Logger,并取得其ConsoleHandler,之后设定它的Formatter为自订的TableFormatter,其执行结果如下:

LogRecord info: onlyfun.caterpillar.FormatterDemo
 Level    |    LoggerName        |    Message       |
 INFO    |    formatterDemo    |    測試訊息1    |

 LogRecord info: onlyfun.caterpillar.FormatterDemo
 Level           |    LoggerName        |    Message      |
 WARNING|    formatterDemo    |    測試訊息2    |