Java : LogManager (ログ) - API使用例
LogManager (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
LogManagerでは、
を行います。
通常のアプリケーションでは、LogManagerを直接使うことはあまりないでしょう。
LoggerやLogManagerを独自実装するときには、いろいろ必要となるかもしれません。
デフォルトの構成ファイルは、以下の場所に格納されています。
java-home/conf/logging.properties
OpenJDK 18.0.2.1 の logging.properties を、参考までに一部抜粋します。
############################################################
# Global properties
############################################################
handlers= java.util.logging.ConsoleHandler
# Default global logging level.
.level= INFO
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
# Limit the messages that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
もし読み込む構成ファイルを変更したい場合は、
java.util.logging.config.file
プロパティにパスを指定して java コマンドで渡します。
実際の例で見ていきましょう。
まず、sample.properties ファイルを用意します。
handlers=java.util.logging.ConsoleHandler
.level=ALL
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.XMLFormatter
次にメインのクラスです。
import java.util.logging.ConsoleHandler;
import java.util.logging.Logger;
public class Main {
public static void main(String[] args) {
System.out.println(System.getProperty("java.util.logging.config.file")); // sample.properties
final var logger = Logger.getLogger("");
System.out.println(logger.getLevel()); // ALL
final var handler = new ConsoleHandler();
System.out.println(handler.getLevel()); // ALL
System.out.println(handler.getFormatter()); // java.util.logging.XMLFormatter@3b07d329
}
}
java コマンドで sample.properties ファイルを指定して、メインクラスを実行します。
java -D"java.util.logging.config.file=sample.properties" Main
フィールド
static final String LOGGING_MXBEAN_NAME
// java.util.logging:type=Logging
System.out.println(LogManager.LOGGING_MXBEAN_NAME);
コンストラクタ
LogManager ()
LogManagerのインスタンスを取得するには、getLogManager() を使います。
一般的には、LogManagerのサブクラスを作ることは少ないと思います。
そのため、コード例は割愛します。
メソッド
LogManager addConfigurationListener (Runnable listener)
final var logManager = LogManager.getLogManager();
final Runnable listener = () -> {
System.out.println("Listener OK!");
};
logManager.addConfigurationListener(listener);
logManager.updateConfiguration(null);
// 結果
// ↓
//Listener OK!
logManager.removeConfigurationListener(listener);
logManager.updateConfiguration(null);
// 結果
// ↓
//<なにも表示されません>
boolean addLogger (Logger logger)
addLogger メソッドは、Logger.getLoggerでログを取得するときなど、必要に応じて自動で呼び出されます。
LoggerやLogManagerを独自実装しない限り、アプリケーションからこのメソッドを呼び出すことはなさそうです。
そのため、API使用例は割愛します。
void checkAccess ()
非推奨です。
Logger getLogger (String name)
final var logManager = LogManager.getLogManager();
// まだ未登録のため null を返します。
final var ret1 = logManager.getLogger("com.example.logging");
System.out.println(ret1); // null
// LoggerがLogManagerに登録されます。
final var ret2 = Logger.getLogger("com.example.logging");
System.out.println(ret2.getName()); // com.example.logging
final var ret3 = logManager.getLogger("com.example.logging");
System.out.println(ret2 == ret3); // true
Enumeration<String> getLoggerNames ()
final var logManager = LogManager.getLogManager();
// デフォルトでは、ルートロガー(空文字)と Logger.GLOBAL_LOGGER_NAME が登録されています。
final var ret1 = logManager.getLoggerNames();
System.out.println(Collections.list(ret1)); // [, global]
final var loggerA = Logger.getLogger("com.example.logging");
System.out.println(loggerA.getName()); // com.example.logging
final var ret2 = logManager.getLoggerNames();
System.out.println(Collections.list(ret2)); // [, global, com.example.logging]
final var loggerB = Logger.getLogger("com.example");
System.out.println(loggerB.getName()); // com.example
final var ret3 = logManager.getLoggerNames();
System.out.println(Collections.list(ret3)); // [, global, com.example, com.example.logging]
static LoggingMXBean getLoggingMXBean ()
非推奨です。
static LogManager getLogManager ()
final var logManager = LogManager.getLogManager();
System.out.println(logManager); // java.util.logging.LogManager@79acc4ff
String getProperty (String name)
// デフォルトのプロパティは
// java-home/conf/logging.properties
// に定義されています。
final var logManager = LogManager.getLogManager();
// Global properties
final var ret1 = logManager.getProperty("handlers");
System.out.println(ret1); // java.util.logging.ConsoleHandler
final var ret2 = logManager.getProperty(".level");
System.out.println(ret2); // INFO
// ConsoleHandler
final var ret3 = logManager.getProperty("java.util.logging.ConsoleHandler.level");
System.out.println(ret3); // INFO
final var ret4 = logManager.getProperty("java.util.logging.ConsoleHandler.formatter");
System.out.println(ret4); // java.util.logging.SimpleFormatter
void readConfiguration ()
LoggerやLogManagerを独自実装しない限り、アプリケーションからこのメソッドを呼び出すことはなさそうです。
そのため、API使用例は割愛します。
関連API : updateConfiguration(InputStream ins, Function<String,BiFunction<String,String,String>> mapper)
void readConfiguration (InputStream ins)
"java.util.logging.config.class" プロパティを使う例です。
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.logging.LogManager;
public class LoggerConfig {
public LoggerConfig() throws IOException {
// 参考:デフォルトの設定
// .level = INFO
// java.util.logging.ConsoleHandler.level = INFO
// java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
// 上記のデフォルトとは違う設定にします。
final var properties = """
.level = ALL
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.XMLFormatter
""";
try (final var ins = new ByteArrayInputStream(properties.getBytes())) {
final var logManager = LogManager.getLogManager();
logManager.readConfiguration(ins);
}
}
}
import java.util.logging.ConsoleHandler;
import java.util.logging.Logger;
public class Main {
public static void main(String[] args) {
final var ret = System.getProperty("java.util.logging.config.class");
System.out.println(ret); // LoggerConfig
final var logger = Logger.getLogger("");
System.out.println(logger.getLevel()); // ALL
final var handler = new ConsoleHandler();
System.out.println(handler.getLevel()); // ALL
System.out.println(handler.getFormatter()); // java.util.logging.XMLFormatter@3b07d329
}
}
"java.util.logging.config.class"は java コマンドの -D オプションで指定します。
java -D"java.util.logging.config.class=LoggerConfig" Main
void removeConfigurationListener (Runnable listener)
removeConfigurationListener の使用例は、addConfigurationListener(Runnable listener) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void reset ()
final var logger = Logger.getLogger("");
System.out.println(logger.getLevel()); // INFO
// ルートロガーをレベルを変えます。
logger.setLevel(Level.ALL);
System.out.println(logger.getLevel()); // ALL
final var logManager = LogManager.getLogManager();
logManager.reset();
System.out.println(logger.getLevel()); // INFO
void updateConfiguration (InputStream ins, Function<String,BiFunction<String,String,String>> mapper)
final var logManager = LogManager.getLogManager();
// 変更前のプロパティ
{
final var ret1 = logManager.getProperty(".level");
System.out.println(ret1); // INFO
final var ret2 = logManager.getProperty("java.util.logging.ConsoleHandler.level");
System.out.println(ret2); // INFO
final var ret3 = logManager.getProperty("java.util.logging.ConsoleHandler.formatter");
System.out.println(ret3); // java.util.logging.SimpleFormatter
}
final var properties = """
.level=ALL
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.XMLFormatter
""";
// すべて新しい構成に置き換える例です。
try (final var ins = new ByteArrayInputStream(properties.getBytes())) {
logManager.updateConfiguration(ins, null);
}
// 変更後のプロパティ
{
final var ret1 = logManager.getProperty(".level");
System.out.println(ret1); // ALL
final var ret2 = logManager.getProperty("java.util.logging.ConsoleHandler.level");
System.out.println(ret2); // ALL
final var ret3 = logManager.getProperty("java.util.logging.ConsoleHandler.formatter");
System.out.println(ret3); // java.util.logging.XMLFormatter
}
final var logManager = LogManager.getLogManager();
final var properties = """
.level=ALL
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.XMLFormatter
""";
// 一部の値をカスタマイズする例です。
try (final var ins = new ByteArrayInputStream(properties.getBytes())) {
logManager.updateConfiguration(ins, (k) -> (o, n) -> {
if (k.equals(".level")) {
// ルートロガーのレベルは、古い値でも新しい値でもない OFF にします。
System.out.println(o); // INFO
System.out.println(n); // ALL
return "OFF";
} else {
// それ以外は新しい値を採用。
return n;
}
});
}
// 変更後のプロパティ
final var ret1 = logManager.getProperty(".level");
System.out.println(ret1); // OFF
final var ret2 = logManager.getProperty("java.util.logging.ConsoleHandler.level");
System.out.println(ret2); // ALL
final var ret3 = logManager.getProperty("java.util.logging.ConsoleHandler.formatter");
System.out.println(ret3); // java.util.logging.XMLFormatter
void updateConfiguration (Function<String,BiFunction<String,String,String>> mapper)
final var logManager = LogManager.getLogManager();
// 変更前のプロパティ
{
final var ret1 = logManager.getProperty(".level");
System.out.println(ret1); // INFO
final var ret2 = logManager.getProperty("java.util.logging.ConsoleHandler.level");
System.out.println(ret2); // INFO
final var ret3 = logManager.getProperty("java.util.logging.ConsoleHandler.formatter");
System.out.println(ret3); // java.util.logging.SimpleFormatter
}
logManager.updateConfiguration((k) -> (o, n) -> {
if (k.equals(".level")) {
// ルートロガーのレベルだけ変更します。
return "ALL";
} else {
// それ以外は変更しません。
return n;
}
});
// 変更後のプロパティ
{
final var ret1 = logManager.getProperty(".level");
System.out.println(ret1); // ALL
final var ret2 = logManager.getProperty("java.util.logging.ConsoleHandler.level");
System.out.println(ret2); // INFO
final var ret3 = logManager.getProperty("java.util.logging.ConsoleHandler.formatter");
System.out.println(ret3); // java.util.logging.SimpleFormatter
}