Java : Logger (ログ) - API使用例
Logger (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
Loggerクラスを使うと、ログをコンソールやファイルに出力することができます。
Loggerを使う大まかな流れは
- Logger.getLogger でLoggerオブジェクトを取得
- log メソッドでログ出力を要求
→登録されているHandler(コンソールやファイル)が実際にログを出力
となります。
final var logger = Logger.getLogger("com.example.logging");
// 分かりやすさのために、親のロガーのハンドラは使わないようにします。
logger.setUseParentHandlers(false);
// コンソールに対してログを出力するように設定します。
final var handler = new ConsoleHandler();
logger.addHandler(handler);
// すべてのレベルのログを出力するように設定します。
logger.setLevel(Level.ALL);
handler.setLevel(Level.ALL);
// logメソッドを使い、ログ出力を要求します。
logger.log(Level.INFO, "INFO LOG!");
// もしくは、各ログレベルに応じたメソッドを使うこともできます。
logger.severe("SEVERE LOG!");
logger.fine("FINE LOG!");
// 結果
// ↓
//3月 10, 2022 2:41:12 午後 com.example.logging.LoggerTest$1 method
//情報: INFO LOG!
//3月 10, 2022 2:41:12 午後 com.example.logging.LoggerTest$1 method
//重大: SEVERE LOG!
//3月 10, 2022 2:41:12 午後 com.example.logging.LoggerTest$1 method
//普通: FINE LOG!
他にも、LogManager でハンドラやログレベルの設定をファイルからロードすることもできます。
ログ出力(ロギング)の基本については下記の記事でもまとめていますので、よろしければそちらもご参照ください。
注意点
Loggerは、ロガーの名前による名前空間によって階層構造をとります。
よって、Loggerオブジェクトは、親となるLoggerオブジェクトを持つことがあります。
その場合、子のLoggerでログ出力を要求すると、親のLoggerにも要求が伝わります。
そのことを知らないと、あれ何で2回も同じログが出力されているのだろう?ということになるのでご注意ください。
final var logger = Logger.getLogger("com.example.logging");
logger.addHandler(new ConsoleHandler());
// ルートロガーを取得します。
Logger parent = logger.getParent();
while (parent.getParent() != null) {
parent = parent.getParent();
}
// ルートロガーは名前が空になります。
final var root = parent;
System.out.println(root.getName()); // ""
System.out.println(root.getLevel()); // INFO
// ルートロガーは、デフォルトでConsoleHandlerを持ちます。
System.out.println(Arrays.toString(root.getHandlers())); // [java.util.logging.ConsoleHandler@4e0b6f09]
logger.log(Level.INFO, "TEST LOG!");
// 結果
// ↓
//3月 10, 2022 2:43:35 午後 com.example.logging.LoggerTest$2 method
//情報: TEST LOG!
//3月 10, 2022 2:43:35 午後 com.example.logging.LoggerTest$2 method
//情報: TEST LOG!
logger.logの呼び出しは1回なのに、コンソールには2回ログが表示されているのが分かりますね。
ルートロガーと子のロガーがそれぞれ ConsoleHandler を持っているので、両方で出力されます。
補足
- 本記事の多くの例では、分かりやすさとシンプルさを優先して setUseParentHandlers(false) で親のハンドラは使わないように指定しています。
- 通常のアプリでは setUseParentHandlers(false) としないほうが良い場合もあると思いますので、そのあたりは適時読み替えてください。
フィールド
static final Logger global
非推奨です。
static final String GLOBAL_LOGGER_NAME
System.out.println(Logger.GLOBAL_LOGGER_NAME); // global
final var logger = Logger.getGlobal();
System.out.println(logger.getName()); // global
コンストラクタ
Logger (String name, String resourceBundleName)
独自のロガーを作ることはそんなにないと思いますので、使用例は割愛します。
もし独自のロガーを作成するさいは、API仕様の「サブクラス化に関する情報」もご確認ください。
メソッド
void addHandler (Handler handler)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// []
System.out.println(Arrays.toString(logger.getHandlers()));
// ハンドラが登録されていないのでなにも起きません。
logger.info("TEST LOG : 1");
// 結果 (コンソール)
// ↓
// <なにも表示されません>
final var handler = new ConsoleHandler();
System.out.println(handler.getLevel()); // INFO
logger.addHandler(handler);
// [java.util.logging.ConsoleHandler@46d59067]
System.out.println(Arrays.toString(logger.getHandlers()));
logger.info("TEST LOG : 2");
// 結果 (コンソール)
// ↓
//3月 12, 2022 3:28:24 午後 com.example.logging.LoggerTest$3 method
//情報: TEST LOG : 2
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// コンソールとファイルの両方へ出力させます。
logger.addHandler(new ConsoleHandler());
final var pattern = Path.of("R:", "java-work", "log.txt");
logger.addHandler(new FileHandler(pattern.toString(), true));
// [java.util.logging.ConsoleHandler@9816741, java.util.logging.FileHandler@1e16c0aa]
System.out.println(Arrays.toString(logger.getHandlers()));
logger.info("TEST LOG!");
// 結果 (コンソール)
// ↓
//3月 10, 2022 3:10:46 午後 com.example.logging.LoggerTest$4 method
//情報: TEST LOG!
// 結果 (ファイル)
// ↓
// --- PowerShell ---
//PS R:\java-work> cat .\log.txt
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-10T06:10:46.844064200Z</date>
// <millis>1646892646844</millis>
// <nanos>64200</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.LoggerTest$4</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
//</record>
//</log>
void config (String msg)
configの使用例は、info(String msg) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void config (Supplier<String> msgSupplier)
configの使用例は、info(Supplier<String> msgSupplier) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void entering (String sourceClass, String sourceMethod)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.FINER);
final var handler = new ConsoleHandler();
handler.setLevel(Level.FINER);
logger.addHandler(handler);
class EntryTest {
public void func() {
try {
logger.entering("EntryTest", "func");
} finally {
logger.exiting("EntryTest", "func");
}
}
}
new EntryTest().func();
// 結果
// ↓
//3月 10, 2022 3:21:24 午後 EntryTest func
//詳細: ENTRY
//3月 10, 2022 3:21:24 午後 EntryTest func
//詳細: RETURN
void entering (String sourceClass, String sourceMethod, Object param1)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.FINER);
final var handler = new ConsoleHandler();
handler.setLevel(Level.FINER);
logger.addHandler(handler);
class EntryTest {
public void func() {
try {
logger.entering("EntryTest", "func", "Param!");
} finally {
logger.exiting("EntryTest", "func", "Result!");
}
}
}
new EntryTest().func();
// 結果
// ↓
//3月 12, 2022 3:34:14 午後 EntryTest func
//詳細: ENTRY Param!
//3月 12, 2022 3:34:14 午後 EntryTest func
//詳細: RETURN Result!
void entering (String sourceClass, String sourceMethod, Object[] params)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.FINER);
final var handler = new ConsoleHandler();
handler.setLevel(Level.FINER);
logger.addHandler(handler);
class EntryTest {
public void func() {
try {
logger.entering("EntryTest", "func",
new String[]{"Param A", "Param B", "Param C"});
} finally {
logger.exiting("EntryTest", "func", "Result!");
}
}
}
new EntryTest().func();
// 結果
// ↓
//3月 12, 2022 3:35:15 午後 EntryTest func
//詳細: ENTRY Param A Param B Param C
//3月 12, 2022 3:35:15 午後 EntryTest func
//詳細: RETURN Result!
void exiting (String sourceClass, String sourceMethod)
exiting の使用例は、entering(String sourceClass, String sourceMethod) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void exiting (String sourceClass, String sourceMethod, Object result)
exiting の使用例は、entering(String sourceClass, String sourceMethod, Object param1) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void fine (String msg)
fineの使用例は、info(String msg) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void fine (Supplier<String> msgSupplier)
fineの使用例は、info(Supplier<String> msgSupplier) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void finer (String msg)
finerの使用例は、info(String msg) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void finer (Supplier<String> msgSupplier)
finerの使用例は、info(Supplier<String> msgSupplier) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void finest (String msg)
finestの使用例は、info(String msg) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void finest (Supplier<String> msgSupplier)
finestの使用例は、info(Supplier<String> msgSupplier) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
static Logger getAnonymousLogger ()
final var logger = Logger.getAnonymousLogger();
System.out.println(logger.getName()); // null
System.out.println(logger.getLevel()); // null
final var parent = logger.getParent();
System.out.println(parent.getName()); // ""
System.out.println(parent.getLevel()); // INFO
final var logger = Logger.getAnonymousLogger();
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.info("TEST LOG!");
// 結果
// ↓
//3月 12, 2022 3:37:14 午後 com.example.logging.LoggerTest$8 method
//情報: TEST LOG!
static Logger getAnonymousLogger (String resourceBundleName)
package com.example.logging;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
final var logger = Logger.getAnonymousLogger("com.example.logging.LoggerResourceBundle");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.info("SAMPLE");
// 結果
// ↓
//3月 12, 2022 3:38:15 午後 com.example.logging.LoggerTest$9 method
//情報: サンプル
Filter getFilter ()
getFilter の使用例は、setFilter(Filter newFilter) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
static final Logger getGlobal ()
System.out.println(Logger.GLOBAL_LOGGER_NAME); // global
final var logger = Logger.getGlobal();
System.out.println(logger.getName()); // global
Handler[] getHandlers ()
final var logger = Logger.getLogger("com.example.logging");
// []
System.out.println(Arrays.toString(logger.getHandlers()));
final var consoleHandler = new ConsoleHandler();
logger.addHandler(consoleHandler);
// [java.util.logging.ConsoleHandler@29290e83]
System.out.println(Arrays.toString(logger.getHandlers()));
final var fileHandler = new FileHandler();
logger.addHandler(fileHandler);
// [java.util.logging.ConsoleHandler@29290e83, java.util.logging.FileHandler@25d9da2a]
System.out.println(Arrays.toString(logger.getHandlers()));
logger.removeHandler(consoleHandler);
// [java.util.logging.FileHandler@25d9da2a]
System.out.println(Arrays.toString(logger.getHandlers()));
logger.removeHandler(fileHandler);
// []
System.out.println(Arrays.toString(logger.getHandlers()));
Level getLevel ()
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
System.out.println(logger.getLevel()); // null
logger.setLevel(Level.FINE);
System.out.println(logger.getLevel()); // FINE
final var handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
logger.info("INFO LOG!");
logger.fine("FINE LOG!");
logger.finest("FINEST LOG!");
// 結果
// ↓
//3月 12, 2022 3:45:54 午後 com.example.logging.LoggerTest$10 method
//情報: INFO LOG!
//3月 12, 2022 3:45:54 午後 com.example.logging.LoggerTest$10 method
//普通: FINE LOG!
static Logger getLogger (String name)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
System.out.println(logger.getName()); // com.example.logging
System.out.println(logger.getLevel()); // null
logger.addHandler(new ConsoleHandler());
logger.info("TEST LOG!");
// 結果
// ↓
//3月 10, 2022 3:52:58 午後 com.example.logging.LoggerTest$11 method
//情報: TEST LOG!
static Logger getLogger (String name, String resourceBundleName)
package com.example.logging;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
final var logger = Logger.getLogger(
"com.example.logging",
"com.example.logging.LoggerResourceBundle");
logger.setUseParentHandlers(false);
// com.example.logging.LoggerResourceBundle
System.out.println(logger.getResourceBundleName());
logger.addHandler(new ConsoleHandler());
logger.info("SAMPLE");
// 結果
// ↓
//3月 10, 2022 3:54:34 午後 com.example.logging.LoggerTest$12 method
//情報: サンプル
String getName ()
final var logger = Logger.getLogger("com.example.logging");
System.out.println(logger.getName()); // com.example.logging
System.out.println(logger.getLevel()); // null
logger.addHandler(new ConsoleHandler());
logger.setUseParentHandlers(false);
logger.info("TEST LOG!");
// 結果
// ↓
//3月 10, 2022 3:56:23 午後 com.example.logging.LoggerTest$13 method
//情報: TEST LOG!
Logger getParent ()
// 名前空間で自動的に親が設定される例です。
final var comLogger = Logger.getLogger("com");
System.out.println(comLogger.getName()); // "com"
final var comExampleLogger = Logger.getLogger("com.example");
System.out.println(comExampleLogger.getName()); // "com.example"
final var parent = comExampleLogger.getParent();
System.out.println(parent.getName()); // "com"
// ルート・ロガーです。
final var parentParent = parent.getParent();
System.out.println(parentParent.getName()); // ""
System.out.println(parentParent.getParent()); // null
ResourceBundle getResourceBundle ()
getResourceBundle の使用例は、setResourceBundle(ResourceBundle bundle) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
String getResourceBundleName ()
getResourceBundleName の使用例は、getLogger(String name, String resourceBundleName) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
boolean getUseParentHandlers ()
getUseParentHandlers の使用例は、setUseParentHandlers(boolean useParentHandlers) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void info (String msg)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.ALL);
final var handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
logger.severe("SEVERE LOG!");
logger.warning("WARNING LOG!");
logger.info("INFO LOG!");
logger.config("CONFIG LOG!");
logger.fine("FINE LOG!");
logger.finer("FINER LOG!");
logger.finest("FINEST LOG!");
// 結果
// ↓
//3月 10, 2022 4:04:12 午後 com.example.logging.LoggerTest$14 method
//重大: SEVERE LOG!
//3月 10, 2022 4:04:12 午後 com.example.logging.LoggerTest$14 method
//警告: WARNING LOG!
//3月 10, 2022 4:04:12 午後 com.example.logging.LoggerTest$14 method
//情報: INFO LOG!
//3月 10, 2022 4:04:12 午後 com.example.logging.LoggerTest$14 method
//構成: CONFIG LOG!
//3月 10, 2022 4:04:12 午後 com.example.logging.LoggerTest$14 method
//普通: FINE LOG!
//3月 10, 2022 4:04:12 午後 com.example.logging.LoggerTest$14 method
//詳細: FINER LOG!
//3月 10, 2022 4:04:12 午後 com.example.logging.LoggerTest$14 method
//最も詳細: FINEST LOG!
void info (Supplier<String> msgSupplier)
Supplier を使うケースの例:
ログのメッセージを作成するためになにか重い処理が必要となるとします。
(例えばログに出力するための情報をデータベースから取得する、など)
Supplierを使うことで、実際にログ出力する直前までその重い処理を遅延させることができます。
つまり、ログレベルの制御などでログが出力されないときは、Supplierは実行されず(重い処理が実行されない)パフォーマンスが良くなるということですね。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.ALL);
final var handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
logger.severe(() -> {
// ... なにか重い処理 ...
return "SEVERE LOG!";
});
logger.warning(() -> {
// ... なにか重い処理 ...
return "WARNING LOG!";
});
logger.info(() -> {
// ... なにか重い処理 ...
return "INFO LOG!";
});
logger.config(() -> {
// ... なにか重い処理 ...
return "CONFIG LOG!";
});
logger.fine(() -> {
// ... なにか重い処理 ...
return "FINE LOG!";
});
logger.finer(() -> {
// ... なにか重い処理 ...
return "FINER LOG!";
});
logger.finest(() -> {
// ... なにか重い処理 ...
return "FINEST LOG!";
});
// 結果
// ↓
//3月 10, 2022 4:05:33 午後 com.example.logging.LoggerTest$15 method
//重大: SEVERE LOG!
//3月 10, 2022 4:05:33 午後 com.example.logging.LoggerTest$15 method
//警告: WARNING LOG!
//3月 10, 2022 4:05:33 午後 com.example.logging.LoggerTest$15 method
//情報: INFO LOG!
//3月 10, 2022 4:05:33 午後 com.example.logging.LoggerTest$15 method
//構成: CONFIG LOG!
//3月 10, 2022 4:05:33 午後 com.example.logging.LoggerTest$15 method
//普通: FINE LOG!
//3月 10, 2022 4:05:33 午後 com.example.logging.LoggerTest$15 method
//詳細: FINER LOG!
//3月 10, 2022 4:05:33 午後 com.example.logging.LoggerTest$15 method
//最も詳細: FINEST LOG!
boolean isLoggable (Level level)
final var logger = Logger.getLogger("com.example.logging");
logger.setLevel(Level.ALL);
System.out.println(logger.isLoggable(Level.SEVERE)); // true
System.out.println(logger.isLoggable(Level.WARNING)); // true
System.out.println(logger.isLoggable(Level.INFO)); // true
System.out.println(logger.isLoggable(Level.CONFIG)); // true
System.out.println(logger.isLoggable(Level.FINE)); // true
System.out.println(logger.isLoggable(Level.FINER)); // true
System.out.println(logger.isLoggable(Level.FINEST)); // true
logger.setLevel(Level.INFO);
System.out.println(logger.isLoggable(Level.SEVERE)); // true
System.out.println(logger.isLoggable(Level.WARNING)); // true
System.out.println(logger.isLoggable(Level.INFO)); // true
System.out.println(logger.isLoggable(Level.CONFIG)); // false
System.out.println(logger.isLoggable(Level.FINE)); // false
System.out.println(logger.isLoggable(Level.FINER)); // false
System.out.println(logger.isLoggable(Level.FINEST)); // false
logger.setLevel(Level.OFF);
System.out.println(logger.isLoggable(Level.SEVERE)); // false
System.out.println(logger.isLoggable(Level.WARNING)); // false
System.out.println(logger.isLoggable(Level.INFO)); // false
System.out.println(logger.isLoggable(Level.CONFIG)); // false
System.out.println(logger.isLoggable(Level.FINE)); // false
System.out.println(logger.isLoggable(Level.FINER)); // false
System.out.println(logger.isLoggable(Level.FINEST)); // false
void log (Level level, String msg)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.ALL);
final var handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
logger.log(Level.SEVERE, "SEVERE LOG!");
logger.log(Level.WARNING, "WARNING LOG!");
logger.log(Level.INFO, "INFO LOG!");
logger.log(Level.CONFIG, "CONFIG LOG!");
logger.log(Level.FINE, "FINE LOG!");
logger.log(Level.FINER, "FINER LOG!");
logger.log(Level.FINEST, "FINEST LOG!");
// 結果
// ↓
//3月 10, 2022 4:08:16 午後 com.example.logging.LoggerTest$16 method
//重大: SEVERE LOG!
//3月 10, 2022 4:08:16 午後 com.example.logging.LoggerTest$16 method
//警告: WARNING LOG!
//3月 10, 2022 4:08:16 午後 com.example.logging.LoggerTest$16 method
//情報: INFO LOG!
//3月 10, 2022 4:08:16 午後 com.example.logging.LoggerTest$16 method
//構成: CONFIG LOG!
//3月 10, 2022 4:08:16 午後 com.example.logging.LoggerTest$16 method
//普通: FINE LOG!
//3月 10, 2022 4:08:16 午後 com.example.logging.LoggerTest$16 method
//詳細: FINER LOG!
//3月 10, 2022 4:08:16 午後 com.example.logging.LoggerTest$16 method
//最も詳細: FINEST LOG!
void log (Level level, String msg, Object param1)
パラメータの param1 以外は、log(Level level, String msg) と同じです。
そちらのAPI使用例もご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// param表示のためにXMLフォーマッタを使います。
final var handler = new ConsoleHandler();
handler.setFormatter(new XMLFormatter());
logger.addHandler(handler);
logger.log(Level.INFO, "TEST LOG!", "Param!");
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-10T07:12:46.997867Z</date>
// <millis>1646896366997</millis>
// <nanos>867000</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.LoggerTest$17</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
// <param>Param!</param>
//</record>
void log (Level level, String msg, Object[] params)
パラメータの params 以外は、log(Level level, String msg) と同じです。
そちらのAPI使用例もご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// param表示のためにXMLフォーマッタを使います。
final var handler = new ConsoleHandler();
handler.setFormatter(new XMLFormatter());
logger.addHandler(handler);
logger.log(Level.INFO, "TEST LOG!",
new String[]{"Param A", "Param B", "Param C"});
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-10T07:48:20.054755200Z</date>
// <millis>1646898500054</millis>
// <nanos>755200</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.LoggerTest$18</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
// <param>Param A</param>
// <param>Param B</param>
// <param>Param C</param>
//</record>
void log (Level level, String msg, Throwable thrown)
パラメータの thrown 以外は、log(Level level, String msg) と同じです。
そちらのAPI使用例もご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.log(Level.SEVERE, "TEST LOG!", new IllegalStateException("TEST EXCEPTION!"));
// 結果
// ↓
//3月 12, 2022 4:03:18 午後 com.example.logging.LoggerTest$19 method
//重大: TEST LOG!
//java.lang.IllegalStateException: TEST EXCEPTION!
// at com.example.logging.LoggerTest$19.method(LoggerTest.java:1230)
//...
void log (Level level, Throwable thrown, Supplier<String> msgSupplier)
パラメータの level については、log(Level level, String msg) のAPI使用例もご参照ください。
また、Supplier を使う利点については info(Supplier<String> msgSupplier) のコメントもご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.log(Level.SEVERE, new IllegalStateException("TEST EXCEPTION!"), () -> {
// ... なにか重い処理 ...
return "TEST LOG!";
});
// 結果
// ↓
//3月 10, 2022 4:56:48 午後 com.example.logging.LoggerTest$20 method
//重大: TEST LOG!
//java.lang.IllegalStateException: TEST EXCEPTION!
// at com.example.logging.LoggerTest$20.method(LoggerTest.java:1265)
//...
void log (Level level, Supplier<String> msgSupplier)
パラメータの level については、log(Level level, String msg) のAPI使用例もご参照ください。
また、Supplier を使う利点については info(Supplier<String> msgSupplier) のコメントもご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.log(Level.INFO, () -> {
// ... なにか重い処理 ...
return "TEST LOG!";
});
// 結果
// ↓
//3月 10, 2022 4:59:47 午後 com.example.logging.LoggerTest$21 method
//情報: TEST LOG!
void log (LogRecord record)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.log(new LogRecord(Level.INFO, "TEST LOG!"));
// 結果
// ↓
//3月 10, 2022 5:15:48 午後 com.example.logging.LoggerTest$28 method
//情報: TEST LOG!
void logp (Level level, String sourceClass, String sourceMethod, String msg)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.ALL);
final var handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
logger.logp(Level.SEVERE, "SampleClass", "sampleMethod", "SEVERE LOG!");
logger.logp(Level.WARNING, "SampleClass", "sampleMethod", "WARNING LOG!");
logger.logp(Level.INFO, "SampleClass", "sampleMethod", "INFO LOG!");
logger.logp(Level.CONFIG, "SampleClass", "sampleMethod", "CONFIG LOG!");
logger.logp(Level.FINE, "SampleClass", "sampleMethod", "FINE LOG!");
logger.logp(Level.FINER, "SampleClass", "sampleMethod", "FINER LOG!");
logger.logp(Level.FINEST, "SampleClass", "sampleMethod", "FINEST LOG!");
// 結果
// ↓
//3月 10, 2022 5:05:29 午後 SampleClass sampleMethod
//重大: SEVERE LOG!
//3月 10, 2022 5:05:29 午後 SampleClass sampleMethod
//警告: WARNING LOG!
//3月 10, 2022 5:05:29 午後 SampleClass sampleMethod
//情報: INFO LOG!
//3月 10, 2022 5:05:29 午後 SampleClass sampleMethod
//構成: CONFIG LOG!
//3月 10, 2022 5:05:29 午後 SampleClass sampleMethod
//普通: FINE LOG!
//3月 10, 2022 5:05:29 午後 SampleClass sampleMethod
//詳細: FINER LOG!
//3月 10, 2022 5:05:29 午後 SampleClass sampleMethod
//最も詳細: FINEST LOG!
void logp (Level level, String sourceClass, String sourceMethod, String msg, Object param1)
パラメータの param1 以外は、logp(Level level, String sourceClass, String sourceMethod, String msg) と同じです。
そちらのAPI使用例もご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// param表示のためにXMLフォーマッタを使います。
final var handler = new ConsoleHandler();
handler.setFormatter(new XMLFormatter());
logger.addHandler(handler);
logger.logp(Level.INFO, "SampleClass", "sampleMethod",
"TEST LOG!", "Param!");
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-10T08:08:20.067530Z</date>
// <millis>1646899700067</millis>
// <nanos>530000</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>SampleClass</class>
// <method>sampleMethod</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
// <param>Param!</param>
//</record>
void logp (Level level, String sourceClass, String sourceMethod, String msg, Object[] params)
パラメータの params 以外は、logp(Level level, String sourceClass, String sourceMethod, String msg) と同じです。
そちらのAPI使用例もご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// params表示のためにXMLフォーマッタを使います。
final var handler = new ConsoleHandler();
handler.setFormatter(new XMLFormatter());
logger.addHandler(handler);
logger.logp(Level.INFO, "SampleClass", "sampleMethod",
"TEST LOG!", new String[]{"Param A", "Param B", "Param C"});
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-10T08:10:18.473365300Z</date>
// <millis>1646899818473</millis>
// <nanos>365300</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>SampleClass</class>
// <method>sampleMethod</method>
// <thread>1</thread>
// <message>TEST LOG!</message>
// <param>Param A</param>
// <param>Param B</param>
// <param>Param C</param>
//</record>
void logp (Level level, String sourceClass, String sourceMethod, String msg, Throwable thrown)
パラメータの thrown 以外は、logp(Level level, String sourceClass, String sourceMethod, String msg) と同じです。
そちらのAPI使用例もご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.logp(Level.SEVERE, "SampleClass", "sampleMethod",
"TEST LOG!", new IllegalStateException("TEST EXCEPTION!"));
// 結果
// ↓
//3月 10, 2022 5:11:53 午後 SampleClass sampleMethod
//重大: TEST LOG!
//java.lang.IllegalStateException: TEST EXCEPTION!
// at com.example.logging.LoggerTest$25.method(LoggerTest.java:1527)
//...
void logp (Level level, String sourceClass, String sourceMethod, Throwable thrown, Supplier<String> msgSupplier)
パラメータの level については、logp(Level level, String sourceClass, String sourceMethod, String msg) のAPI使用例もご参照ください。
また、Supplier を使う利点については info(Supplier<String> msgSupplier) のコメントもご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.logp(Level.SEVERE, "SampleClass", "sampleMethod",
new IllegalStateException("TEST EXCEPTION!"), () -> {
// ... なにか重い処理 ...
return "TEST LOG!";
});
// 結果
// ↓
//3月 10, 2022 5:13:46 午後 SampleClass sampleMethod
//重大: TEST LOG!
//java.lang.IllegalStateException: TEST EXCEPTION!
// at com.example.logging.LoggerTest$26.method(LoggerTest.java:1563)
//...
void logp (Level level, String sourceClass, String sourceMethod, Supplier<String> msgSupplier)
パラメータの level については、logp(Level level, String sourceClass, String sourceMethod, String msg) のAPI使用例もご参照ください。
また、Supplier を使う利点については info(Supplier<String> msgSupplier) のコメントもご参照ください。
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
logger.logp(Level.INFO, "SampleClass", "sampleMethod", () -> {
// ... なにか重い処理 ...
return "TEST LOG!";
});
// 結果
// ↓
//3月 10, 2022 5:14:52 午後 SampleClass sampleMethod
//情報: TEST LOG!
void logrb (Level level, String sourceClass, String sourceMethod, String bundleName, String msg)
非推奨です。
void logrb (Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Object param1)
非推奨です。
void logrb (Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Object[] params)
非推奨です。
void logrb (Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Throwable thrown)
非推奨です。
void logrb (Level level, String sourceClass, String sourceMethod, ResourceBundle bundle, String msg, Object... params)
package com.example.logging;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// params表示のためにXMLフォーマッタを使います。
final var handler = new ConsoleHandler();
handler.setFormatter(new XMLFormatter());
logger.addHandler(handler);
final var bundle = ResourceBundle.getBundle("com.example.logging.LoggerResourceBundle");
logger.logrb(Level.INFO, "SampleClass", "sampleMethod", bundle,
"SAMPLE", "Param A", "Param B", "Param C");
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-10T10:36:55.051176100Z</date>
// <millis>1646908615051</millis>
// <nanos>176100</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>SampleClass</class>
// <method>sampleMethod</method>
// <thread>1</thread>
// <message>サンプル</message>
// <key>SAMPLE</key>
// <catalog>com.example.logging.LoggerResourceBundle</catalog>
// <param>Param A</param>
// <param>Param B</param>
// <param>Param C</param>
//</record>
void logrb (Level level, String sourceClass, String sourceMethod, ResourceBundle bundle, String msg, Throwable thrown)
package com.example.logging;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
final var bundle = ResourceBundle.getBundle("com.example.logging.LoggerResourceBundle");
logger.logrb(Level.SEVERE, "SampleClass", "sampleMethod", bundle,
"SAMPLE", new IllegalStateException("TEST EXCEPTION!"));
// 結果
// ↓
//3月 10, 2022 5:27:26 午後 SampleClass sampleMethod
//重大: サンプル
//java.lang.IllegalStateException: TEST EXCEPTION!
// at com.example.logging.LoggerTest$30.method(LoggerTest.java:1739)
//...
void logrb (Level level, ResourceBundle bundle, String msg, Object... params)
package com.example.logging;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
// params表示のためにXMLフォーマッタを使います。
final var handler = new ConsoleHandler();
handler.setFormatter(new XMLFormatter());
logger.addHandler(handler);
final var bundle = ResourceBundle.getBundle("com.example.logging.LoggerResourceBundle");
logger.logrb(Level.INFO, bundle, "SAMPLE", "Param A", "Param B", "Param C");
// 結果
// ↓
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-10T09:59:15.937614400Z</date>
// <millis>1646906355937</millis>
// <nanos>614400</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.LoggerTest$31</class>
// <method>method</method>
// <thread>1</thread>
// <message>サンプル</message>
// <key>SAMPLE</key>
// <catalog>com.example.logging.LoggerResourceBundle</catalog>
// <param>Param A</param>
// <param>Param B</param>
// <param>Param C</param>
//</record>
void logrb (Level level, ResourceBundle bundle, String msg, Throwable thrown)
package com.example.logging;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
final var bundle = ResourceBundle.getBundle("com.example.logging.LoggerResourceBundle");
logger.logrb(Level.SEVERE, bundle, "SAMPLE", new IllegalStateException("TEST EXCEPTION!"));
// 結果
// ↓
//3月 10, 2022 5:28:21 午後 com.example.logging.LoggerTest$32 method
//重大: サンプル
//java.lang.IllegalStateException: TEST EXCEPTION!
// at com.example.logging.LoggerTest$32.method(LoggerTest.java:1848)
//...
void removeHandler (Handler handler)
removeHandler の使用例は、getHandlers() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void setFilter (Filter newFilter)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
// フィルタなしの例です。
System.out.println(logger.getFilter()); // null
logger.info("abcde");
logger.info("ABCDE");
// 結果
// ↓
//3月 10, 2022 5:31:19 午後 com.example.logging.LoggerTest$33 method
//情報: abcde
//3月 10, 2022 5:31:19 午後 com.example.logging.LoggerTest$33 method
//情報: ABCDE
// フィルタありの例です。
final var filter = new Filter() {
@Override
public boolean isLoggable(LogRecord logRecord) {
// 小文字だけを許容します。
return logRecord.getMessage().matches("[a-z]*");
}
};
logger.setFilter(filter);
System.out.println(logger.getFilter() == filter); // true
logger.info("abcde");
logger.info("ABCDE");
// 結果
// ↓
//3月 10, 2022 5:31:19 午後 com.example.logging.LoggerTest$33 method
//情報: abcde
void setLevel (Level newLevel)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
final var handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
System.out.println(logger.getLevel()); // ALL
logger.severe("SEVERE LOG!");
logger.warning("WARNING LOG!");
logger.info("INFO LOG!");
logger.config("CONFIG LOG!");
logger.fine("FINE LOG!");
logger.finer("FINER LOG!");
logger.finest("FINEST LOG!");
// 結果
// ↓
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//重大: SEVERE LOG!
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//警告: WARNING LOG!
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//情報: INFO LOG!
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//構成: CONFIG LOG!
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//普通: FINE LOG!
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//詳細: FINER LOG!
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//最も詳細: FINEST LOG!
logger.setLevel(Level.INFO);
System.out.println(logger.getLevel()); // INFO
logger.severe("SEVERE LOG!");
logger.warning("WARNING LOG!");
logger.info("INFO LOG!");
logger.config("CONFIG LOG!");
logger.fine("FINE LOG!");
logger.finer("FINER LOG!");
logger.finest("FINEST LOG!");
// 結果
// ↓
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//重大: SEVERE LOG!
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//警告: WARNING LOG!
//3月 10, 2022 5:34:57 午後 com.example.logging.LoggerTest$34 method
//情報: INFO LOG!
logger.setLevel(Level.OFF);
System.out.println(logger.getLevel()); // OFF
logger.severe("SEVERE LOG!");
logger.warning("WARNING LOG!");
logger.info("INFO LOG!");
logger.config("CONFIG LOG!");
logger.fine("FINE LOG!");
logger.finer("FINER LOG!");
logger.finest("FINEST LOG!");
// 結果
// ↓
// <なにも表示されません>
void setParent (Logger parent)
API仕様に "アプリケーション・コードから呼び出してはいけません" とあるので、コード例は割愛します。
void setResourceBundle (ResourceBundle bundle)
package com.example.logging;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.addHandler(new ConsoleHandler());
System.out.println(logger.getResourceBundle()); // null
final var bundle = ResourceBundle.getBundle("com.example.logging.LoggerResourceBundle");
logger.setResourceBundle(bundle);
System.out.println(logger.getResourceBundle() == bundle); // true
logger.info("SAMPLE");
// 結果
// ↓
//3月 10, 2022 5:36:35 午後 com.example.logging.LoggerTest$35 method
//情報: サンプル
void setUseParentHandlers (boolean useParentHandlers)
final var logger = Logger.getLogger("com.example.logging");
System.out.println(logger.getUseParentHandlers()); // true
logger.addHandler(new ConsoleHandler());
// 1つ親のロガーを作成します。
final var parent = Logger.getLogger("com.example");
parent.setUseParentHandlers(false);
System.out.println(parent.getUseParentHandlers()); // false
// 親はXMLフォーマットで出力させます。
final var parentHandler = new ConsoleHandler();
parentHandler.setFormatter(new XMLFormatter());
parent.addHandler(parentHandler);
System.out.println(logger.getParent() == parent); // true
// 子のロガーで出力します。
logger.info("TEST LOG : 1");
// 結果 (親と子の両方のハンドラで出力されます)
// ↓
//3月 10, 2022 5:40:30 午後 com.example.logging.LoggerTest$36 method
//情報: TEST LOG : 1
//
//<?xml version="1.0" encoding="UTF-8" standalone="no"?>
//<!DOCTYPE log SYSTEM "logger.dtd">
//<log>
//<record>
// <date>2022-03-10T08:40:30.781869900Z</date>
// <millis>1646901630781</millis>
// <nanos>869900</nanos>
// <sequence>1</sequence>
// <logger>com.example.logging</logger>
// <level>INFO</level>
// <class>com.example.logging.LoggerTest$36</class>
// <method>method</method>
// <thread>1</thread>
// <message>TEST LOG : 1</message>
//</record>
// 親のハンドラ使用を停止します。
logger.setUseParentHandlers(false);
System.out.println(logger.getUseParentHandlers()); // false
// 子のロガーで出力します。
logger.info("TEST LOG : 2");
// 結果 (子のハンドラのみで出力されます)
// ↓
//3月 10, 2022 5:40:30 午後 com.example.logging.LoggerTest$36 method
//情報: TEST LOG : 2
void severe (String msg)
severeの使用例は、info(String msg) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void severe (Supplier<String> msgSupplier)
severeの使用例は、info(Supplier<String> msgSupplier) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void throwing (String sourceClass, String sourceMethod, Throwable thrown)
final var logger = Logger.getLogger("com.example.logging");
logger.setUseParentHandlers(false);
logger.setLevel(Level.FINER);
final var handler = new ConsoleHandler();
handler.setLevel(Level.FINER);
logger.addHandler(handler);
logger.throwing("SampleClass", "sampleMethod",
new IllegalStateException("TEST EXCEPTION!"));
// 結果
// ↓
//3月 10, 2022 5:47:26 午後 SampleClass sampleMethod
//詳細: THROW
//java.lang.IllegalStateException: TEST EXCEPTION!
// at com.example.logging.LoggerTest$37.method(LoggerTest.java:2195)
//...
void warning (String msg)
warningの使用例は、info(String msg) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void warning (Supplier<String> msgSupplier)
warningの使用例は、info(Supplier<String> msgSupplier) にまとめて記載しました。
そちらのAPI使用例をご参照ください。