ネイティブ・イメージでのロギング

ネイティブ・イメージは、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オプションを通じてイメージに含まれている必要があります。

このオプションの詳細は、実行時におけるリソースへのアクセスに関する情報を参照してください。