Java : Formatter (ログ) - API使用例
Formatter (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
Formatterクラスは、ログをどのように整形して出力するのか? を実装するためのベースとなるクラスです。
標準APIには、サブクラスとして SimpleFormatter, XMLFormatter の2つが用意されています。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final var handler = new ConsoleHandler();
logger.addHandler(handler);
// ConsoleHandlerのデフォルトのフォーマッタは SimpleFormatter です。
System.out.println(handler.getFormatter()); // java.util.logging.SimpleFormatter@d76b01a
logger.info("TEST LOG!");
// 結果
// ↓
//3月 17, 2022 2:02:14 午後 com.example.logging.FormatterTest$1 method
//情報: TEST LOG!
// XMLFormatterの例です。
handler.setFormatter(new XMLFormatter());
logger.info("TEST LOG!");
// 結果
// ↓
//<record>
// <date>2022-03-17T05:02:14.017796500Z</date>
// <millis>1647493334017</millis>
// <nanos>796500</nanos>
// <sequence>2</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.FormatterTest$1</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
//</record>
もしくは独自に実装することも可能です。
// ログを1行で表示するフォーマッタ例です。
class SingleLineFormatter extends Formatter {
@Override
public String format(LogRecord logRecord) {
final var message = formatMessage(logRecord);
return "%s (%s) : %s%n".formatted(
logRecord.getInstant(), logRecord.getLevel().getName(), message);
}
}
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final var handler = new ConsoleHandler();
logger.addHandler(handler);
handler.setFormatter(new SingleLineFormatter());
logger.info("TEST LOG : 1");
logger.info("TEST LOG : 2");
// 結果
// ↓
//2022-03-17T05:10:41.581937800Z (INFO) : TEST LOG : 1
//2022-03-17T05:10:41.584935200Z (INFO) : TEST LOG : 2
コンストラクタ
Formatter ()
このコンストラクタの使用例は、format(LogRecord record) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
メソッド
abstract String format (LogRecord record)
class MyFormatter extends Formatter {
@Override
public String format(LogRecord logRecord) {
final var message = formatMessage(logRecord);
return "%s: %s%n".formatted(logRecord.getLevel().getName(), message);
}
}
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final var handler = new ConsoleHandler();
logger.addHandler(handler);
handler.setFormatter(new MyFormatter());
logger.info("TEST LOG : 1");
logger.info("TEST LOG : 2");
// 結果
// ↓
//INFO: TEST LOG : 1
//INFO: TEST LOG : 2
String formatMessage (LogRecord record)
package com.example.logging;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
class MyFormatter extends Formatter {
@Override
public String format(LogRecord logRecord) {
final var message = formatMessage(logRecord);
return "%s (%s) : %s%n".formatted(
logRecord.getInstant(), logRecord.getLevel().getName(), message);
}
}
final var logger = Logger.getLogger(
"com.example.logging", "com.example.logging.LoggerResourceBundle");
logger.setUseParentHandlers(false);
final var handler = new ConsoleHandler();
logger.addHandler(handler);
handler.setFormatter(new MyFormatter());
logger.info("SAMPLE");
// 結果
// ↓
//2022-03-17T05:13:59.950513100Z (INFO) : サンプル
String getHead (Handler h)
class MyFormatter extends Formatter {
@Override
public String format(LogRecord logRecord) {
final var message = formatMessage(logRecord);
return "%s (%s) : %s%n".formatted(
logRecord.getInstant(), logRecord.getLevel().getName(), message);
}
@Override
public String getHead(Handler h) {
return "--- head ---%n".formatted();
}
@Override
public String getTail(Handler h) {
return "--- tail ---%n".formatted();
}
}
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final var pattern = Path.of("R:", "java-work", "log.txt");
final var handler = new FileHandler(pattern.toString());
logger.addHandler(handler);
handler.setFormatter(new MyFormatter());
logger.info("TEST LOG : 1");
logger.info("TEST LOG : 2");
logger.removeHandler(handler);
handler.close();
System.out.print(Files.readString(pattern));
// 結果
// ↓
//--- head ---
//2022-03-17T05:18:12.308480200Z (INFO) : TEST LOG : 1
//2022-03-17T05:18:12.310478600Z (INFO) : TEST LOG : 2
//--- tail ---
String getTail (Handler h)
getTail の使用例は、getHead(Handler h) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
関連記事
- API 使用例