From Gossip@Openhome

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    |