Java : XMLFormatter (ログ) - API使用例
XMLFormatter (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
XMLFormatterは、ログをXML形式で出力します。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final var pattern = Path.of("R:", "java-work", "log.txt");
// FileHandlerのデフォルトのフォーマッタはXMLFormatterとなります。
final var handler = new FileHandler(pattern.toString());
System.out.println(handler.getFormatter()); // java.util.logging.XMLFormatter@2c83f1d1
logger.addHandler(handler);
logger.info("TEST LOG : 1");
logger.info("TEST LOG : 2");
System.out.print(Files.readString(pattern));
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-18T07:23:03.832551900Z</date>
// <millis>1647588183832</millis>
// <nanos>551900</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.XMLFormatterTest$1</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG : 1</message>
//</record>
//<record>
// <date>2022-03-18T07:23:03.838548100Z</date>
// <millis>1647588183838</millis>
// <nanos>548100</nanos>
// <sequence>2</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.XMLFormatterTest$1</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG : 2</message>
//</record>
1件のログは、1件の record 要素となります。
XML形式なので、テキストエディタで直接解析するのはちょっと厳しいですね。
なにかしらのログ解析ツールに読み込ませて使うのが前提になりそうです。
コンストラクタ
XMLFormatter ()
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final var handler = new ConsoleHandler();
logger.addHandler(handler);
System.out.println(handler.getFormatter()); // java.util.logging.SimpleFormatter@84e9fc3
handler.setFormatter(new XMLFormatter());
System.out.println(handler.getFormatter()); // java.util.logging.XMLFormatter@63bfd328
logger.info("TEST LOG!");
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-18T07:25:20.352589Z</date>
// <millis>1647588320352</millis>
// <nanos>589000</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.XMLFormatterTest$2</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
//</record>
メソッド
String format (LogRecord record)
class MyFormatter extends XMLFormatter {
@Override
public String format(LogRecord logRecord) {
logRecord.setMessage(logRecord.getMessage() + " : override format!");
return super.format(logRecord);
}
}
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!");
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-18T07:28:47.638092600Z</date>
// <millis>1647588527638</millis>
// <nanos>92600</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.XMLFormatterTest$3</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG! : override format!</message>
//</record>
String getHead (Handler h)
class MyFormatter extends XMLFormatter {
@Override
public String getHead(Handler h) {
return "<root>\n";
}
@Override
public String getTail(Handler h) {
return "</root>\n";
}
}
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));
// 結果
// ↓
//<root>
//<record>
// <date>2022-03-18T07:36:49.173484100Z</date>
// <millis>1647589009173</millis>
// <nanos>484100</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.XMLFormatterTest$4</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG : 1</message>
//</record>
//<record>
// <date>2022-03-18T07:36:49.177482200Z</date>
// <millis>1647589009177</millis>
// <nanos>482200</nanos>
// <sequence>2</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.XMLFormatterTest$4</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG : 2</message>
//</record>
//</root>
String getTail (Handler h)
このメソッドの使用例は、getHead(Handler h) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
Formatterで宣言されたメソッド
formatMessage
「Java API 使用例 : Formatter」をご参照ください。