web-dev-qa-db-ja.com

log4jはどこで/どのようにlog4j.propertiesファイルを探しますか?

シンプルなテストアプリでlog4jを試しています。 Eclipseで新しいJava=プロジェクトを作成し、ビルドパスにlog4j JAR(v1.2.16)を追加します。次に、Hello Worldを出力する単純なクラスを作成します。次に、log4j Loggerクラスで情報メッセージをログに記録します。アプリを実行すると、デフォルトのアペンダーとレイアウトであると想定しているログメッセージが表示されます。問題は、独自の構成を追加することです。私がやったことです:

カスタムアペンダーとログレベルでlog4j.propertiesファイルを作成し、それをsrcフォルダーに配置しました(コンパイル時にbinフォルダーにコピーされます)。アプリを実行-変更なし。

PropertyConfigurator.configure("log4j.properties")を追加してみます。アプリを実行-変更なし。エラーはありませんが、変更はありません。

Log4jに設定ファイルをロードさせるには何をしなければなりませんか?

26
Marplesoft

ああ。私は、Eclipseが間違ったLoggerクラスをインポートしたことが問題であることを発見しました。 Java.util.logging.Loggerをインポートしました。もちろん、log4jとは異なる独自の設定があります。まあ、誰かがこれをやって、この質問を読んで解決してくれることを願っています。

8
Marplesoft

RTFMを使用していない場合は、見出し Default Initialization Procedure の下に以下が表示されます。

正確なデフォルトの初期化アルゴリズムは次のように定義されています。

  1. log4j.defaultInitOverrideシステムプロパティを "false"以外の値に設定すると、log4jはデフォルトの初期化手順(この手順)をスキップします。
  2. リソース文字列変数をlog4j.configurationシステムプロパティの値に設定します。デフォルトの初期化ファイルを指定する好ましい方法は、log4j.configurationシステムプロパティを使用することです。システムプロパティlog4j.configurationが定義されていない場合は、文字列変数リソースをそのデフォルト値 "log4j.properties"に設定します。
  3. リソース変数をURLに変換してみてください。
  4. MalformedURLExceptionなどが原因でリソース変数をURLに変換できない場合は、URLを返すorg.Apache.log4j.helpers.Loader.getResource(resource、Logger.class)を呼び出してクラスパスからリソースを検索します。 文字列 "log4j.properties"は不正な形式のURLを構成することに注意してください。リストについては Loader.getResource(Java.lang.String) を参照してください検索された場所。
  5. URLが見つからなかった場合は、デフォルトの初期化を中止します。それ以外の場合は、URLからlog4jを構成します。 PropertyConfigurator は、URLを解析してlog4jを構成するために使用されます。ただし、URLが「.xml」拡張子で終わっていない場合は、 DOMConfigurator が使用されます。オプションで、カスタムコンフィギュレーターを指定できます。 log4j.configuratorClassシステムプロパティの値は、カスタムコンフィギュレーターの完全修飾クラス名として使用されます。指定するカスタムコンフィギュレーターは、Configuratorインターフェイスを実装する必要があります。
37
crowne

log4j.debugシステムプロパティを設定することで、log4jの内部デバッグを有効にできます。特に、これによりlog4jはそれ自体がどのように構成されているかを示します。

log4j.configurationシステムプロパティを使用して、構成ファイルへのURLを明示的に設定してみることができます。

参照: この質問

7
Jason Day

classpathが定義されている場合、問題はclasspathにある可能性があります。

読み込まれなかった理由(私の場合):競合するlog4j.propertiesファイルが私のjarファイルの1つにあり、それがclasspathのファイルをオーバーロードしていました。

要するに、あなたのlog4j.propertiesファイルがロードされていません。別の場所に上書きされている可能性があります。

誰かがこれに遭遇した場合に備えて、私もこれを投入すると思いました。私は過去5時間を費やして、なぜ私のデフォルトlog4j.propertiesが読み込まれません。

5
user2029861

log4j.propertiesはクラスパスにある必要があります。 「binフォルダー」にコピーされた「srcフォルダー」(ここではEclipseセットアップについて話していると思います)は通常、クラスパスに属しているため、それが見つかります(「srcフォルダーの先頭に配置していますか? 「フォルダですよね?)

2
leonbloy

私はこれが2か月前のものであることを知っていますが、scrフォルダーがbinフォルダーに「コピー」されておらず、ランタイムクラスパスの一部でもないことを指摘する必要があると思います...(ビルドパスはランタイムクラスパス!) Eclipseは、srcフォルダー内のソースファイルをbin(または任意の)フォルダーにコンパイルします。これは、ランタイムクラスパスの一部であるbinフォルダーです。

これらのスレッドは非常にジュニアプログラマーによっても読み込まれることが多いため、この点を指摘したいと思います。また、ほとんどのスレッドがJavaクラスパスの細かさを理解しておらず、したがって、それに対して回避可能な間違いを犯してください。

1