Java : XMLFormatter (ログ) - API使用例

XMLFormatter (Java SE 17 & JDK 17) の使用例まとめです。
だいたいのメソッドを網羅済みです。
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 ()

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)

指定されたメッセージをXMLにフォーマットします。

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)

XMLでフォーマットされたレコードのセットのヘッダー文字列を返します。

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)

XMLでフォーマットされたレコードのセットの末尾の文字列を返します。

このメソッドの使用例は、getHead(Handler h) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

Formatterで宣言されたメソッド

formatMessage

Java API 使用例 : Formatter」をご参照ください。


関連記事

ページの先頭へ