Log4jを取得してプロパティファイルを取得するにはどうすればよいですか。
Log4jを使用したいJavaデスクトップアプリを書いています。メインメソッドでこれがあれば:
PropertyConfigurator.configure("log4j.properties");
Jarを開いたとき、log4j.propertiesファイルは同じディレクトリにあります。
しかし、私はこのエラーを受け取ります:
log4j:ERROR構成ファイル[log4j.properties]を読み取れませんでした。 Java.io.FileNotFoundException:log4j.properties(システムは指定されたファイルを見つけることができません)
何が間違っていますか?
Configureメソッドは絶対パスを期待していると思います。とにかく、最初にPropertiesオブジェクトをロードすることもできます。
Properties props = new Properties();
props.load(new FileInputStream("log4j.properties"));
PropertyConfigurator.configure(props);
プロパティファイルがjarにある場合、次のようなことができます。
Properties props = new Properties();
props.load(getClass().getResourceAsStream("/log4j.properties"));
PropertyConfigurator.configure(props);
上記では、log4j.propertiesがjarファイルのルートフォルダーにあると想定しています。
PropertyConfigurator.configure(String configFilename)を使用する場合、これらはlog4jライブラリで次の操作になります。
Properties props = new Properties();
FileInputStream istream = null;
try {
istream = new FileInputStream(configFileName);
props.load(istream);
istream.close();
}
catch (Exception e) {
...
アプリケーションが実行されている現在のディレクトリから「Log4j.properties」を検索するため、読み取りに失敗します。
プロパティファイルの読み取り部分を次のように変更し、CLASSPATHが設定されているディレクトリに「log4j.properties」を配置する方法についてはどうでしょう。
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL url = loader.getResource("log4j.properties");
PropertyConfigurator.configure(url);
Jarファイルに「Log4j.properties」を置く別の方法があります。
jar xvf [YourApplication].jar log4j.properties
-Dlog4j.configuration = file:log4j.propertiesを設定するだけでうまくいきました。
次に、log4jは、アプリケーションの現在の作業ディレクトリでfile log4j.propertiesを探します。
Log4j.configurationは[〜#〜] url [〜#〜]仕様であるため、通常のファイルを参照する場合は、log4j.propertiesファイル名の前に「file:」を追加してください。ファイルシステム上、つまりクラスパス上にないファイル!
最初に-Dlog4j.configuration = log4j.propertiesを指定しました。ただし、log4j.propertiesがクラスパス上にある場合にのみ機能します。プロジェクトのmain/resourcesにlog4j.propertiesをコピーし、ターゲットディレクトリ(mavenプロジェクト)にコピーされるように再構築すると、これも機能しました(または、プロジェクトjarにlog4j.propertiesをパッケージ化できましたが、ユーザーがロガー構成を編集できるようにします!)。
これは、@ kgiannakakisからの回答の編集です。元のコードは、Properties.load(InputStream)
が呼び出された後にInputStreamを正しく閉じないため、間違っています。 Javadocsから:The specified stream remains open after this method returns.
================================
Configureメソッドは絶対パスを期待していると思います。とにかく、最初にPropertiesオブジェクトをロードすることもできます。
Properties props = new Properties();
InputStream is = new FileInputStream("log4j.properties");
try {
props.load(is);
}
finally {
try {
is.close();
}
catch (Exception e) {
// ignore this exception
}
}
PropertyConfigurator.configure(props);
プロパティファイルがjarにある場合、次のようなことができます。
Properties props = new Properties();
InputStream is = getClass().getResourceAsStream("/log4j.properties");
try {
props.load(is);
}
finally {
try {
is.close();
}
catch (Exception e) {
// ignore this exception
}
}
PropertyConfigurator.configure(props);
上記では、log4j.propertiesがjarファイルのルートフォルダーにあると想定しています。
今日、私のアプリケーションにこのコードがあります
File log4jfile = new File("./conf/log4j.properties");
PropertyConfigurator.configure(log4jfile.getAbsolutePath());
相対パスは、JVMの作業ディレクトリ(JVMが開始する場所)からのものです。
Log4j.propertiesディレクトリは、Javaクラスパスにある必要があります。あなたの場合、CWDをクラスパスに追加するshould仕事。
JVM引数は最終的にシステム変数としてJavaプログラムに渡されるため、実行ポイントの先頭でこのコードを使用してプロパティを編集し、log4jにシステムで設定したばかりのプロパティを読み取らせることができます物性
try {
System.setProperty("log4j.configuration", new File(System.getProperty("user.dir")+File.separator+"conf"+File.separator+"log4j.properties").toURI().toURL().toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}