web-dev-qa-db-ja.com

デフォルトの初期化のためにJava.util.logging.config.fileをロードします

アプリケーションの起動時にカスタムlog.propertiesファイルをロードしようとしています。

プロパティファイルはメインクラスと同じパッケージにあるため、-Djava.util.logging.config.file=log.propertiesコマンドラインパラメーターでプロパティファイルをロードすると想定しました。

しかし、プロパティは、プロパティファイルへの完全な絶対パスを指定した場合にのみ読み込まれます。相対パスを使用する方法の提案はありますか?

25
abp

Javaロギングは、ファイル全体をハードディスク全体で検索するわけではありません。ファイルの検索方法には非常に単純なルールがあります。 Javaで2つのファイルが互いに属していることを確認したいが、どこにも属していないことを確認したい。Javaはプロパティファイルとクラスがディスク上の同じフォルダにあること以外は、ファイルを見つけることができません。

-Djava.util.logging.config.file=log.propertiesは、ファイルlog.propertiesは、Javaプロセスの現在のディレクトリにあります(かなりランダムな場合があります)。したがって、ここでは絶対パスを使用する必要があります。

別の解決策は、ファイルを移動することですlogging.propertiesから$Java_HOME/lib/(またはそこにあるはずのファイルを編集します)。その場合、システムプロパティを設定する必要はありません。

19
Aaron Digulla

動的にロードできますJava.util.logging相対パスからのプロパティファイルは非常に簡単です。これはstatic {}Mainクラスのブロック。あなたのlogging.propertiesファイルをdefault packageそして、次のコードで非常に簡単にアクセスできます。

final InputStream inputStream = Main.class.getResourceAsStream("/logging.properties");
try
{
    LogManager.getLogManager().readConfiguration(inputStream);
}
catch (final IOException e)
{
    Logger.getAnonymousLogger().severe("Could not load default logging.properties file");
    Logger.getAnonymousLogger().severe(e.getMessage());
}
51
user177800

util loggingはクラスパスから読み込まれません。絶対パスが必要なため、log4jなどの他のロギングパッケージは設定がはるかに簡単で、absパスを取得するのが面倒なWebアプリに適しています。

これは、Java.util.logging.LogManager docoではまったく説明されていません。

7
user280033