広告

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

Formatter (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

FormatterはLogRecordのフォーマット処理をサポートします。

クラス構成

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使用例をご参照ください。


関連記事

ページの先頭へ