log4j.propertiesファイルはどこに置くべきですか?


135

私はGlassfish v2.1でnetbeans 6.7.1を使用してWebサービスプロジェクトを作成し、log4j.propertiesをプロジェクトのルートディレクトリに配置して使用します。

static Logger logger = Logger.getLogger(MyClass.class);

コンストラクタで:

PropertyConfigurator.configure("log4j.properties");

と関数で:

logger.info("...");
logger.error("...");
// ...

しかし、それはエラー情報です(実際には、私が認識できるほとんどすべてのディレクトリにそれを入れようとしました):

log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:297)
        at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:315)
        at com.corp.ors.demo.OrsDemo.main(OrisDemo.java:228)
log4j:ERROR Ignoring configuration file [log4j.properties].
log4j:WARN No appenders could be found for logger (com.corp.ors.demo.OrsDemo).
log4j:WARN Please initialize the log4j system properly.

サンプルプロジェクトはhttp://www.91files.com/?N3F0QGQPWMDGPBRN0QA8から取得できます


2
PropertyConfigurator.configure( "log4j.properties");の目的は何ですか?ライン?私はこれを決して使用しません。log4j.xmlファイルは、クラスパスの「どこか」にのみ存在する必要があります。
アントワーヌクラヴァル

1
stackoverflow.com/questions/1140358/…を見て、log4j構成自体がどのように記録されているかを確認してください。一部のコンテナーには独自のlog4j構成があるため、これは多くの場合に役立つはずです。
dz。

@AntoineClaval私はその呪われた行を削除し、それは魅力のように働きました。男、
なんて

回答:


113

私はこの質問に答えるのが少し遅いことを知っています、そしておそらくあなたはすでに解決策を見つけました、しかし私は私が見つけた解決策を投稿します(私がたくさんググった後)のでそれは少し助けになるかもしれません:

  1. このスレッドで前述したように、log4j.propertiesをプロジェクトのWEB-INF \ classesの下に配置します。
  2. log4j-xx.jarをWEB-INF \ libの下に置きます
  3. log4jが読み込まれたかどうかをテストし-Dlog4j.debugます。@ tomcatのJavaオプションの最後に@を追加します。

これがお役に立てば幸いです。

rgds


'run'コマンドを使用して、Tomcatをフォアグラウンドで取得します。コマンドラインからjavaオプションを渡すことができます。また、bashの-xオプションは、オプションの正確な動作を確認するのに役立ちます。JAVA_OPTS= -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM

50

すでに述べたように、log4j.propertiesはクラスパスに含まれているディレクトリにある必要があります。mavenizedプロジェクトでは、 src/main/resources/log4j.properties


26

VM引数-Dlog4j.configuration = "file:/ C:/workspace3/local/log4j.properties"で構成ファイルの場所を指定できます


それはfile:/かfile:///か、UNIXシステムの/ path / to / fileか?
モルフェウス

Windowsの場合はfile:/だけです
。unix

これは、異なるログレベルを持つ複数の環境を考慮に入れる唯一の回答です。
マット

macOSでは、Liberty Serverのjvm.optionsで引用符を使用せず、file:///を使用します
wnm3

欲求不満を解消するのに役立つ更新だけです。log4j2を使用している場合、引数の名前は次のように変更されましたlog4j.configurationFile
dan.mはuser2321368 '18

25

実行コンテキストに対応するルートディレクトリに配置する必要があります。

例:

    MyProject
       src
           MyClass.java
           log4j.properties

別のプロジェクトから実行を開始する場合は、実行を開始するために使用するプロジェクトにそのファイルが必要です。たとえば、別のプロジェクトがいくつかのJUnitテストを保持している場合は、log4j.propertiesファイルも必要です。


log4j.propertiesの代わりにlog4j.xmlを使用することをお勧めします。より多くのオプションがあり、IDEなどからの支援を得ます...


たとえば、ほぼすべてのディレクトリに配置します。ただし、GFはプロパティを正しいディレクトリにコピーしないため、Glassfishのデプロイプロジェクトには役立ちません。GFはそれを失うようです。
モノ

実際、問題はネットビーンの自動配備にあると思います。私は管理コンソールでwarファイルでデプロイしようとしていますが、問題ありません。私が正しかったかどうかわかりません。私が正しかった場合、プロジェクトを自動デプロイするときにnetbeansがこれらのファイルをデプロイしないのはなぜですか。
モノ

出来た !しかし、それは優雅ではありません...それはそれが「リソース」種類のフォルダに置かれるほうが良いと思います。
Adams.H 2014

17

Mavenベースのプロジェクトの場合、log4j.propertiesをsrc / main / resourcesに保持します。ほかにすることがない!


それだけです。MavenプロジェクトのXMLConfigurationのような他のプロパティファイルでも同じです。ありがとう!
ラモン

13

log4j.propertiesをsrc内に配置する場合、ステートメントを使用する必要はありません-

PropertyConfigurator.configure("log4j.properties");

プロパティファイルはクラスパスにあるため、自動的に取得されます。


10

試してください:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));

9

ファイルはWEB-INF / classesディレクトリにある必要があります。このディレクトリ構造は、warファイル内にパッケージ化する必要があります。


理論的にはそれが答えですが、問題はGlassfishがwarファイルをデプロイするとlog4j.propertiesが失われることです。
モノ

3
WEB-INF / classesにあり、warファイル内にパッケージ化されている必要があります
Martin OConnor

@mono-少なくともダウンロード可能なアーカイブでは、web / WEB-INF / classesにlog4j.propertiesはありません。マーティンは正しいです、それはそれがあるべきところです。
2009年

コツは、srcフォルダー(ルートソースフォルダー)に置くことです。コードのビルドプロセスで、ファイルは自動的にクラスフォルダーに転送されます...
Mostafa Zeinali

7

私のIDEはNetBeansです。写真のようにlog4j.propertyファイルを入れました

ルート

プロジェクトのルートフォルダ

ウェブ

Webフォルダー

WEB-INF

WEB-INFフォルダー

このプロパティファイルを使用するには、次のコードを記述する必要があります。

package example;

import java.io.File;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.Logger;
import javax.servlet.*;
public class test {

public static ServletContext context;
static Logger log = Logger.getLogger("example/test");

public test() {

        String homeDir = context.getRealPath("/");
        File propertiesFile = new File(homeDir, "WEB-INF/log4j.properties");
        PropertyConfigurator.configure(propertiesFile.toString());
        log.info("This is a test");
    }
}

別のJSPファイルから静的なServletContextコンテキストを定義できます。例:

test.context = getServletContext(); 
test sample = new test(); 

これで、プロジェクトでlog4j.propertyファイルを使用できます。


5

すでに提供されている技術的に正しい特定の回答がいくつかありますが、一般的には、ランタイムクラスパスのどこにでも、つまり、JVMがクラスを探しているところならどこでもかまいません。

これはEclipseの/ srcディレクトリーまたはデプロイされたアプリのWEB-INF / classesディレクトリーにすることができますが、クラスパスの概念とファイルがその中に配置される理由を知っておくのが最善です。WEB-INF/だけではなく、 「マジック」ディレクトリとしてのクラス。


5

log4j.propertiesファイルが表示されない理由を解明するために、かなりの時間を費やしました。
次に、MyProject / target / classes /およびMyProject / src / main / resourcesフォルダーの両方にある場合にのみ、プロジェクトで表示されることに気付きました。
誰かに役立つことを願っています。
PS:プロジェクトはmavenベースでした。


3

Glassfishはデフォルトで[Glassfishインストール場所] \ glassfish \ domains [your domain] \をデフォルトの作業ディレクトリとして探していることがわかりました...この場所にlog4j.propertiesファイルをドロップし、PropertyConfiguratorを使用してコードで初期化できます前述のとおり...

Properties props = System.getProperties();
System.out.println("Current working directory is " + props.getProperty("user.dir"));
PropertyConfigurator.configure("log4j.properties");

1

これが正しい方法かわかりませんが、問題は解決しました。log4j.propertiesファイルを「プロジェクトフォルダ」/ configに置き、PropertyConfigurator.configure( "config // log4j.properties");を使用します。

IDEで動作しますが、jarファイルを自分で実行する場合は動作しません。jarファイルを自分で実行するときは、log4j.propertiesファイルをjarファイルが置かれているフォルダーにコピーするだけです。jarとプロパティファイルが同じディレクトリにあるときは、うまく実行されます。


1

log4j.propertiesをクラスパスに配置します。適切な場所を特定するのに役立つ2つのケースを次に示します。1。Webアプリケーションの場合、クラスパスは/ WEB-INF / classesです。

\WEB-INF      
    classes\
        log4j.properties
  1. メイン/単体テストからテストするには、クラスパスはソースディレクトリです

    \Project\
       src\
          log4j.properties

1

それを行うには多くの方法があります:

方法1:PropertyConfiguratorを使用せずにmavenプロジェクトで試行している場合

まず、scr / mainでリソースディレクトリを確認します

  if available,
       then: create a .properties file and add all configuration details.
  else
       then: create a directory named resources and a file with .properties     
write your configuration code/details.

スクリーンショットに従います:

![ここに画像の説明を入力してください

方法2: java / mavenプロジェクトのプロパティファイルを使用する場合は、PropertyConfiguratorを使用します。

プロパティファイルをプロジェクトの任意の場所に配置し、正しいパスを指定します。言う:src / javaLog4jProperties / log4j.properties

静的{

 PropertyConfigurator.configure("src/javaLog4jProperties/log4j.properties");

}

ここに画像の説明を入力してください

方法3: java / mavenプロジェクトでxmlを使用している場合は、DOMConfiguratorを使用します

プロパティファイルをプロジェクトの任意の場所に配置し、正しいパスを指定します。言う:src / javaLog4jProperties / log4j.xml

静的{

 DOMConfigurator.configure("src/javaLog4jProperties/log4j.xml");

}

ここに画像の説明を入力してください


1

標準のプロジェクト設定には、次のようなプロジェクト構造があります。

src/main/java
src/main/resources

リソースフォルダー内にlog4j.propertiesを配置します。リソースフォルダーが存在しない場合は作成できます。


0

実際、私はこの問題をstardard Javaプロジェクト構造で次のように経験しました。

\myproject
    \src
    \libs
    \res\log4j.properties

Eclipseでは、ビルドパスにresフォルダーを追加する必要がありますが、Intellijでは、リンクされたスクリーンショットが示すように、resフォルダーをリソースとしてマークする必要があります。resフォルダーを右クリックして、リソースとしてマークします


0

指定する必要はありません PropertyConfigurator.configure("log4j.properties");プロジェクト構造で既にlog4j.propertiesを定義している場合は、Log4Jクラスで。

Webダイナミックプロジェクトの場合:-

WebContent-> WEB-INF-> log4j.propertiesの下にlog4j.propertiesを保存する必要があります

これがお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.