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

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


概要

クラス構成

StreamHandlerクラスは、指定したOutputStreamがログの出力先となるハンドラです。
主に、OutputStreamを使うハンドラの基底クラスとして使われます。

代表的なサブクラスとして、ConsoleHandlerFileHandlerがあります。

関連:ロギング(ログ出力)の基本

コンストラクタ

StreamHandler ()

現在の出力ストリームを持たないStreamHandlerを作成します。

final var outputStream = new ByteArrayOutputStream();

class SampleStreamHandler extends StreamHandler {
    SampleStreamHandler() {
        super();
        setOutputStream(outputStream);
    }
}

final var handler = new SampleStreamHandler();

System.out.println(handler.getLevel()); // INFO
System.out.println(handler.getFormatter()); // java.util.logging.SimpleFormatter@76d7e04

final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(handler);

logger.info("TEST LOG!");
handler.flush();

System.out.print(outputStream);

// 結果
// ↓
//3月 14, 2022 4:10:00 午後 com.example.logging.StreamHandlerTest$1 method
//情報: TEST LOG!

StreamHandler (OutputStream out, Formatter formatter)

指定されたFormatterと出力ストリームを持つStreamHandlerを作成します。

final var outputStream = new ByteArrayOutputStream();

final var handler = new StreamHandler(outputStream, new SimpleFormatter());

System.out.println(handler.getLevel()); // INFO
System.out.println(handler.getFormatter()); // java.util.logging.SimpleFormatter@84e9fc3

final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(handler);

logger.info("TEST LOG!");
handler.flush();

System.out.print(outputStream);

// 結果
// ↓
//3月 14, 2022 4:17:05 午後 com.example.logging.StreamHandlerTest$2 method
//情報: TEST LOG!

メソッド

void close ()

現在の出力ストリームを閉じます。

final var pattern = Path.of("R:", "java-work", "log.txt");

final StreamHandler handler = new FileHandler(pattern.toString());
handler.setFormatter(new SimpleFormatter());

final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(handler);

logger.info("BEFORE CLOSE LOG!");
System.out.println(Files.readString(pattern));

// 結果
// ↓
//3月 14, 2022 4:21:01 午後 com.example.logging.StreamHandlerTest$3 method
//情報: BEFORE CLOSE LOG!

handler.close();

logger.info("AFTER CLOSE LOG!");
System.out.println(Files.readString(pattern));

// 結果 (クローズ後のログは出力されません)
// ↓
//3月 14, 2022 4:21:01 午後 com.example.logging.StreamHandlerTest$3 method
//情報: BEFORE CLOSE LOG!

void flush ()

すべてのバッファされたメッセージをフラッシュします。

final var outputStream = new ByteArrayOutputStream();
final var handler = new StreamHandler(outputStream, new SimpleFormatter());

final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(handler);

logger.info("TEST LOG!");

System.out.println("-- before flush --");
System.out.println(outputStream);

handler.flush();

System.out.println("-- after flush --");
System.out.println(outputStream);

// 結果
// ↓
//-- before flush --
//
//-- after flush --
//3月 14, 2022 4:26:13 午後 com.example.logging.StreamHandlerTest$4 method
//情報: TEST LOG!

boolean isLoggable (LogRecord record)

このHandlerが、指定されたLogRecordを実際にロギングするかどうかを調べます。

final var handler = new StreamHandler(new ByteArrayOutputStream(), new SimpleFormatter());
System.out.println(handler.getLevel()); // INFO

final var ret1 = handler.isLoggable(new LogRecord(Level.WARNING, "WARNING!"));
System.out.println(ret1); // true

final var ret2 = handler.isLoggable(new LogRecord(Level.INFO, "INFO!"));
System.out.println(ret2); // true

final var ret3 = handler.isLoggable(new LogRecord(Level.FINE, "FINE!"));
System.out.println(ret3); // false

final var ret4 = handler.isLoggable(new LogRecord(Level.FINER, "FINER!"));
System.out.println(ret4); // false
final var handler = new StreamHandler(new ByteArrayOutputStream(), new SimpleFormatter());
final var logRecord = new LogRecord(Level.INFO, "TEST LOG!");

System.out.println(handler.isLoggable(logRecord)); // true

handler.close();

System.out.println(handler.isLoggable(logRecord)); // false
// ストリーム未設定
final var handler = new StreamHandler();
final var logRecord = new LogRecord(Level.INFO, "TEST LOG!");

System.out.println(handler.isLoggable(logRecord)); // false

void publish (LogRecord record)

LogRecordをフォーマットして発行します。

final var outputStream = new ByteArrayOutputStream();
final var handler = new StreamHandler(outputStream, new SimpleFormatter()) {
    @Override
    public synchronized void publish(LogRecord logRecord) {
        // 意図的にメッセージを加工します。
        logRecord.setMessage(logRecord.getMessage() + ":override publish!");

        super.publish(logRecord);
    }
};

final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(handler);

logger.info("TEST LOG!");
handler.flush();

System.out.print(outputStream);

// 結果
// ↓
//3月 14, 2022 4:33:31 午後 com.example.logging.StreamHandlerTest$5 method
//情報: TEST LOG!:override publish!

void setEncoding (String encoding)

このHandlerが使用する文字エンコーディングを設定または変更します。

System.out.println(Charset.defaultCharset()); // UTF-8

final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);

final var outputStream = new ByteArrayOutputStream();
final var handler = new StreamHandler(outputStream, new SimpleFormatter());

System.out.println(handler.getEncoding()); // null

logger.addHandler(handler);

logger.info("TEST LOG : 〇△□×");
handler.flush();

// UTF-8用のコンソールへ出力する例です。
System.out.print(outputStream);

// 結果
// ↓
//3月 14, 2022 4:51:17 午後 com.example.logging.StreamHandlerTest$6 method
//情報: TEST LOG : 〇△□×
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);

final var outputStream = new ByteArrayOutputStream();
final var handler = new StreamHandler(outputStream, new SimpleFormatter());
logger.addHandler(handler);

handler.setEncoding("Shift_JIS");
System.out.println(handler.getEncoding()); // Shift_JIS

logger.info("TEST LOG : 〇△□×");
handler.flush();

// UTF-8用のコンソールへ出力する例です。
System.out.print(outputStream);

// 結果 (SJIS用のコンソールではないので文字化けします)
// ↓
//3�� 14, 2022 4:50:17 �ߌ� 3�� 14, 2022 4:52:56 �ߌ� com.example.logging.StreamHandlerTest$7 method
//���: TEST LOG : �Z�����~

protected void setOutputStream (OutputStream out)

出力ストリームを変更します。

StreamHandler()の使用例に setOutputStream もまとめて記載しました。
API使用例はそちらをご参照ください。

Handlerで宣言されたメソッド

getEncoding, getErrorManager, getFilter, getFormatter, getLevel, reportError, setErrorManager, setFilter, setFormatter, setLevel

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


関連記事

ページの先頭へ