Java : Handler (ログ) - API使用例
Handler (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
Handlerクラスは、ログをどこに出力するのか?を決める抽象クラスです。
例えば、サブクラスの ConsoleHandler はコンソールに、FileHandler はファイルにログを出力します。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.ALL);
final Handler handler = new ConsoleHandler();
logger.addHandler(handler);
logger.info("TEST LOG!");
// 結果 (コンソール)
// ↓
//10月 23, 2022 3:43:17 午後 com.example.logging.HandlerTest$1 method
//情報: TEST LOG!
コンストラクタ
Handler ()
※独自のHandlerを作るときに使います。
class SampleHandler extends Handler {
@Override
public void publish(LogRecord record) {
// 必要な処理を実装
}
@Override
public void flush() {
// 必要な処理を実装
}
@Override
public void close() throws SecurityException {
// 必要な処理を実装
}
}
final Handler handler = new SampleHandler();
System.out.println(handler.getLevel()); // ALL
System.out.println(handler.getFilter()); // null
System.out.println(handler.getFormatter()); // null
メソッド
abstract void close ()
final var pattern = Path.of("R:", "java-work", "log.txt");
System.out.println(pattern); // R:\java-work\log.txt
final Handler handler = new FileHandler(pattern.toString());
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(handler);
logger.info("TEST LOG!");
// 不要になったハンドラを閉じます。
logger.removeHandler(handler);
handler.close();
System.out.println(Files.readString(pattern));
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-13T10:43:28.380133800Z</date>
// <millis>1647168208380</millis>
// <nanos>133800</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.HandlerTest$1</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
//</record>
//</log>
abstract void flush ()
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final var outputStream = new ByteArrayOutputStream();
// flushの効果が分かりやすいように StreamHandler を使います。
final Handler handler = new StreamHandler(outputStream, new SimpleFormatter());
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月 13, 2022 5:34:25 午後 com.example.logging.HandlerTest$2 method
//情報: TEST LOG!
String getEncoding ()
System.out.println(Charset.defaultCharset()); // UTF-8
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final Handler handler = new ConsoleHandler();
System.out.println(handler.getEncoding()); // null
logger.addHandler(handler);
logger.info("TEST LOG : 〇△□×");
// UTF-8用のコンソールへ出力する例です。
// 結果
// ↓
//3月 13, 2022 7:55:02 午後 com.example.logging.HandlerTest$3 method
//情報: TEST LOG : 〇△□×
handler.setEncoding("Shift_JIS");
System.out.println(handler.getEncoding()); // Shift_JIS
logger.info("TEST LOG : 〇△□×");
// 結果 (SJIS用のコンソールではないので文字化けします)
// ↓
//3�� 13, 2022 7:55:02 �ߌ� com.example.logging.HandlerTest$3 method
//���: TEST LOG : �Z�����~
ErrorManager getErrorManager ()
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final Handler handler = new ConsoleHandler() {
@Override
public void publish(LogRecord record) {
// 意図的に例外をレポートします。
reportError("TEST ERROR!",
new IllegalStateException("TEST EXCEPTION!"),
ErrorManager.GENERIC_FAILURE);
}
};
logger.addHandler(handler);
class CustomErrorManager extends ErrorManager {
@Override
public synchronized void error(String msg, Exception ex, int code) {
System.err.println("CUSTOM ERROR! : " + msg + " : " + ex.getMessage());
}
}
// デフォルトのErrorManager
System.out.println(handler.getErrorManager() instanceof CustomErrorManager); // false
logger.info("TEST LOG!");
// 結果
// ↓
//java.util.logging.ErrorManager: 0: TEST ERROR!
//java.lang.IllegalStateException: TEST EXCEPTION!
// at com.example.logging.HandlerTest$6$1.publish(HandlerTest.java:354)
//...
// カスタムしたErrorManager
handler.setErrorManager(new CustomErrorManager());
System.out.println(handler.getErrorManager() instanceof CustomErrorManager); // true
logger.info("TEST LOG!");
// 結果
// ↓
//CUSTOM ERROR! : TEST ERROR! : TEST EXCEPTION!
Filter getFilter ()
final Handler handler = new ConsoleHandler();
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(handler);
System.out.println(handler.getFilter()); // null
logger.info("abcd");
logger.info("EFG");
logger.info("xyz");
// 結果 (フィルタなし)
// ↓
//3月 13, 2022 8:03:08 午後 com.example.logging.HandlerTest$4 method
//情報: abcd
//3月 13, 2022 8:03:08 午後 com.example.logging.HandlerTest$4 method
//情報: EFG
//3月 13, 2022 8:03:08 午後 com.example.logging.HandlerTest$4 method
//情報: xyz
final var filter = new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
// 小文字のみを対象とします。
final var msg = record.getMessage();
return msg.equals(msg.toLowerCase());
}
};
handler.setFilter(filter);
System.out.println(filter == handler.getFilter()); // true
logger.info("abcd");
logger.info("EFG");
logger.info("xyz");
// 結果 (フィルタあり)
// ↓
//3月 13, 2022 8:04:04 午後 com.example.logging.HandlerTest$4 method
//情報: abcd
//3月 13, 2022 8:04:04 午後 com.example.logging.HandlerTest$4 method
//情報: xyz
Formatter getFormatter ()
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// ConsoleHandlerのデフォルトはSimpleFormatter
final Handler handler = new ConsoleHandler();
logger.addHandler(handler);
// java.util.logging.SimpleFormatter@6a8658ff
System.out.println(handler.getFormatter());
logger.info("TEST LOG!");
// 結果
// ↓
//3月 13, 2022 6:35:17 午後 com.example.logging.HandlerTest$5 method
//情報: TEST LOG!
handler.setFormatter(new XMLFormatter());
// java.util.logging.XMLFormatter@491b9b8
System.out.println(handler.getFormatter());
logger.info("TEST LOG!");
// 結果
// ↓
//<record>
// <date>2022-03-13T09:35:17.399239800Z</date>
// <millis>1647164117399</millis>
// <nanos>239800</nanos>
// <sequence>2</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.HandlerTest$5</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
//</record>
Level getLevel ()
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.ALL);
final Handler handler = new ConsoleHandler();
logger.addHandler(handler);
// ConsoleHandlerのデフォルトレベルはINFO
System.out.println(handler.getLevel()); // INFO
logger.warning("WARNING LOG!");
logger.info("INFO LOG!");
logger.fine("FINE LOG!");
logger.finer("FINER LOG!");
// 結果
// ↓
//3月 13, 2022 7:28:11 午後 com.example.logging.HandlerTest$7 method
//警告: WARNING LOG!
//3月 13, 2022 7:28:11 午後 com.example.logging.HandlerTest$7 method
//情報: INFO LOG!
handler.setLevel(Level.FINE);
System.out.println(handler.getLevel()); // FINE
logger.warning("WARNING LOG!");
logger.info("INFO LOG!");
logger.fine("FINE LOG!");
logger.finer("FINER LOG!");
// 結果
// ↓
//3月 13, 2022 7:28:11 午後 com.example.logging.HandlerTest$7 method
//警告: WARNING LOG!
//3月 13, 2022 7:28:11 午後 com.example.logging.HandlerTest$7 method
//情報: INFO LOG!
//3月 13, 2022 7:28:11 午後 com.example.logging.HandlerTest$7 method
//普通: FINE LOG!
boolean isLoggable (LogRecord record)
final Handler handler = new ConsoleHandler();
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
abstract void publish (LogRecord record)
getErrorManager()の使用例に publish もまとめて記載しました。
API使用例はそちらをご参照ください。
protected void reportError (String msg, Exception ex, int code)
getErrorManager()の使用例に reportError もまとめて記載しました。
API使用例はそちらをご参照ください。
void setEncoding (String encoding)
getEncoding()の使用例に setEncoding もまとめて記載しました。
API使用例はそちらをご参照ください。
void setErrorManager (ErrorManager em)
getErrorManager()の使用例に setErrorManager もまとめて記載しました。
API使用例はそちらをご参照ください。
void setFilter (Filter newFilter)
getFilter()の使用例に setFilter もまとめて記載しました。
API使用例はそちらをご参照ください。
void setFormatter (Formatter newFormatter)
getFormatter()の使用例に setFormatter もまとめて記載しました。
API使用例はそちらをご参照ください。
void setLevel (Level newLevel)
getLevel()の使用例に setLevel もまとめて記載しました。
API使用例はそちらをご参照ください。
関連記事
- API 使用例