除了XMLFormatter与SimpleFormatter之外,您也可以自订自己的记录输出格式,只要继承抽象类别Formatter,并重新定义其format()方法即可,format()方法会传入一个LogRecord对象作为参数,您可以使用它来取得一些与程序执行有关的信息。
下面这个程序是个简单的示范,自订一个简单的TableFormatter:
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对象,例如:
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 |