シンプルなテストアプリでlog4jを試しています。 Eclipseで新しいJava=プロジェクトを作成し、ビルドパスにlog4j JAR(v1.2.16)を追加します。次に、Hello Worldを出力する単純なクラスを作成します。次に、log4j Logger
クラスで情報メッセージをログに記録します。アプリを実行すると、デフォルトのアペンダーとレイアウトであると想定しているログメッセージが表示されます。問題は、独自の構成を追加することです。私がやったことです:
カスタムアペンダーとログレベルでlog4j.propertiesファイルを作成し、それをsrcフォルダーに配置しました(コンパイル時にbinフォルダーにコピーされます)。アプリを実行-変更なし。
PropertyConfigurator.configure("log4j.properties")
を追加してみます。アプリを実行-変更なし。エラーはありませんが、変更はありません。
Log4jに設定ファイルをロードさせるには何をしなければなりませんか?
ああ。私は、Eclipseが間違ったLogger
クラスをインポートしたことが問題であることを発見しました。 Java.util.logging.Loggerをインポートしました。もちろん、log4jとは異なる独自の設定があります。まあ、誰かがこれをやって、この質問を読んで解決してくれることを願っています。
RTFMを使用していない場合は、見出し Default Initialization Procedure の下に以下が表示されます。
正確なデフォルトの初期化アルゴリズムは次のように定義されています。
log4j.defaultInitOverride
システムプロパティを "false
"以外の値に設定すると、log4jはデフォルトの初期化手順(この手順)をスキップします。- リソース文字列変数を
log4j.configuration
システムプロパティの値に設定します。デフォルトの初期化ファイルを指定する好ましい方法は、log4j.configuration
システムプロパティを使用することです。システムプロパティlog4j.configurationが定義されていない場合は、文字列変数リソースをそのデフォルト値 "log4j.properties
"に設定します。- リソース変数をURLに変換してみてください。
- MalformedURLExceptionなどが原因でリソース変数をURLに変換できない場合は、URLを返すorg.Apache.log4j.helpers.Loader.getResource(resource、Logger.class)を呼び出してクラスパスからリソースを検索します。 文字列 "
log4j.properties
"は不正な形式のURLを構成することに注意してください。リストについては Loader.getResource(Java.lang.String) を参照してください検索された場所。- URLが見つからなかった場合は、デフォルトの初期化を中止します。それ以外の場合は、URLからlog4jを構成します。 PropertyConfigurator は、URLを解析してlog4jを構成するために使用されます。ただし、URLが「
.xml
」拡張子で終わっていない場合は、 DOMConfigurator が使用されます。オプションで、カスタムコンフィギュレーターを指定できます。log4j.configuratorClass
システムプロパティの値は、カスタムコンフィギュレーターの完全修飾クラス名として使用されます。指定するカスタムコンフィギュレーターは、Configurator
インターフェイスを実装する必要があります。
log4j.debug
システムプロパティを設定することで、log4jの内部デバッグを有効にできます。特に、これによりlog4jはそれ自体がどのように構成されているかを示します。
log4j.configuration
システムプロパティを使用して、構成ファイルへのURLを明示的に設定してみることができます。
参照: この質問 。
classpath
が定義されている場合、問題はclasspath
にある可能性があります。
読み込まれなかった理由(私の場合):競合するlog4j.properties
ファイルが私のjarファイルの1つにあり、それがclasspath
のファイルをオーバーロードしていました。
要するに、あなたのlog4j.properties
ファイルがロードされていません。別の場所に上書きされている可能性があります。
誰かがこれに遭遇した場合に備えて、私もこれを投入すると思いました。私は過去5時間を費やして、なぜ私のデフォルトlog4j.properties
が読み込まれません。
log4j.properties
はクラスパスにある必要があります。 「binフォルダー」にコピーされた「srcフォルダー」(ここではEclipseセットアップについて話していると思います)は通常、クラスパスに属しているため、それが見つかります(「srcフォルダーの先頭に配置していますか? 「フォルダですよね?)
私はこれが2か月前のものであることを知っていますが、scrフォルダーがbinフォルダーに「コピー」されておらず、ランタイムクラスパスの一部でもないことを指摘する必要があると思います...(ビルドパスはランタイムクラスパス!) Eclipseは、srcフォルダー内のソースファイルをbin(または任意の)フォルダーにコンパイルします。これは、ランタイムクラスパスの一部であるbinフォルダーです。
これらのスレッドは非常にジュニアプログラマーによっても読み込まれることが多いため、この点を指摘したいと思います。また、ほとんどのスレッドがJavaクラスパスの細かさを理解しておらず、したがって、それに対して回避可能な間違いを犯してください。