ネイティブ・イメージでのロギング
ネイティブ・イメージは、java.util.logging.*
APIを使用したロギングをデフォルトでサポートしています。
デフォルトのロギング構成
デフォルトでネイティブ・イメージに組み込まれるロギング構成は、JDKにあるlogging.properties
ファイルに基づいています。これにより、INFO
以上のレベルのメッセージのみを表示するjava.util.logging.ConsoleHandler
が構成されています。カスタム・ロギング構成は、次に説明するように、イメージのビルド時または実行時にロードできます。
追加のロギング・ハンドラを使用する場合は、対応するクラスをリフレクション用に登録する必要があります。たとえば、java.util.logging.FileHandler
を使用する場合は、次のリフレクション構成が必要です:
{
"name" : "java.util.logging.FileHandler",
"methods" : [
{ "name" : "<init>", "parameterTypes" : [] },
]
}
詳細は、リフレクション・サポート・ページを参照してください。
ビルド時のロガーの初期化
ロガーは、次のコードに示すように、イメージのビルド時にカスタムのlogging.properties
構成を使用して初期化できます:
public class BuildTimeLoggerInit {
private static final Logger LOGGER;
static {
LogManager.getLogManager().readConfiguration(BuildTimeLoggerInit.class.getResourceAsStream("logging.properties"));
LOGGER = Logger.getLogger(BuildTimeLoggerInit.class.getName());
}
public static void main(String[] args) throws IOException {
// Use the LOGGER here
}
}
logging.properties
ファイルはイメージのビルド時に処理されます。ネイティブ・イメージに含める必要はないため、イメージ・サイズは小さくなります。
LoggerHolder.LOGGER
もイメージのビルド時に初期化され、実行時にすぐに使用できるため、起動が改善されます。アプリケーションで実行時にカスタムのlogging.properties
構成を処理する必要がないかぎり、このアプローチをお薦めします。
実行時のロガーの初期化
ロガーは、次のコードに示すように、実行時にも初期化できます:
public class RuntimeLoggerInit {
public static void main(String[] args) throws IOException {
LogManager.getLogManager().readConfiguration(RuntimeLoggerInit.class.getResourceAsStream("logging.properties"));
Logger logger = Logger.getLogger(RuntimeLoggerInit.class.getName());
// Use the logger here
}
}
この場合、logging.properties
ファイルが実行時処理に使用可能であり、-H:IncludeResources=logging.properties
オプションを通じてイメージに含まれている必要があります。
このオプションの詳細は、実行時におけるリソースへのアクセスに関する情報を参照してください。