ロガー(log4j)のアペンダーが見つかりませんでしたか?


369

ビルドパスにlog4jを入れましたが、アプリケーションを実行すると次のメッセージが表示されます。

log4j:WARN No appenders could be found for logger (dao.hsqlmanager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

これらの警告はどういう意味ですか?ここのアペンダーは何ですか?


5
これは実行時の警告のようです。コンパイルするときにこれを確認してもよろしいですか?
maba、2012

5
警告の最後の行にあるURLにアクセスしてみましたか?
Jesper、2012

4
はい!!!しかし、それはあまり言いません...私は自分のアペンダーを構成するためにプロパティファイルが必要であることがわかりました!
2012

構成ファイルを手動で編集して、アペンダーを追加します。正しい有効な構成ドキュメントがあることを確認してください。
Roman C

回答:


464

このlog4jガイドの短い紹介は少し古いですが、まだ有効です。

このガイドでは、ロガーとアペンダーの使用方法に関する情報を提供します。


あなたが行くためにあなたが取ることができる2つの単純なアプローチがあります。

まず、このメソッドをメインメソッドに追加するだけです。

BasicConfigurator.configure();

2番目の方法は、この標準log4j.properties(上記のガイドから取得)ファイルをクラスパスに追加することです。

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

3
最初のステップだけでOKです。log4jガイドの簡単な紹介からの引用
ray6080 2014年

65
新しいつまずきのために... log4j.propertiesファイルをsrc / main / resourcesに追加します。これは、Mavenプロジェクトがあることを前提としています。src / main / resourcesにあるものはクラスパスに含まれています。
ケニ

3
IntelliJ ideaオープンモジュール設定でリソースフォルダーを選択し、リソースをクリックすると、クラスパスにすべてのリソースが自動的に追加されます。
Waqas

1
助けにはならなかった。私はEclipse Neon for C ++を使用していて、log4j.propertiesをeclipse実行可能ファイルと並べて配置しましたが、助けにはなりませんでした
Nadav B

log4j.rootLogger=DEBUG, A1私がいつも見逃していた行です。
モハマドファイサル

74

log4j.propertiesEclipseのクラスパスにファイルの場所を追加する必要があるようです。

プロジェクトがEclipseで開いていることを確認してから、Eclipseの上部にある[実行]メニューをクリックし、次をクリックします。

  1. 走る
  2. 実行構成
  3. クラスパス(タブ)
  4. ユーザーエントリー
  5. 詳細(右側のボタン)
  6. フォルダを追加
  7. 次に、log4j.propertiesファイルを含むフォルダーに移動します。
  8. 申し込む
  9. 走る

エラーメッセージは表示されなくなります。


警告メッセージは現在表示されていませんが、それでもログが目的の場所に書き込まれていません
Arpan Saini

48

迅速な解決策:

  1. main関数にコードを追加します。

    String log4jConfPath = "/path/to/log4j.properties";
    PropertyConfigurator.configure(log4jConfPath);
  2. / path / toに log4j.propertiesという名前のファイルを作成します

    log4j.rootLogger=INFO, stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

log4j.propertiesファイルをsrc / test / resourceのようなリソースディレクトリ内に配置します
Alok

log4j.propertiesパスの明示的な宣言を回避するには、それをプロジェクトフォルダー内に配置し、String log4jConfPath = System.getProperty( "user.dir")+ File.separator + "log4j.properties";のようにアクセスします。
Amimo Benja

36

これは単なる警告です。

修正

これは、デフォルトの構成ファイルlog4j.propertieslog4j.xml明示的な設定が見つからないし、アプリケーションを実行することはできません。

それを修正するには、単にコピー/作成するlog4j.propertiesか、log4j.xml上のAの場所にクラスパス(通常はjarファイルと同じ)をます。

オプションでjavaオプションを設定します-Dlog4j.configuration=file:///path/to/log4j.properties

log4jThread.getContextClassLoader().getResource()デフォルトの構成ファイルを見つけるために使用し、ファイルシステムを直接チェックしません。配置する適切な場所を知る、log4j.propertiesまたはlog4j.xml使用中のクラスローダーの検索戦略を理解する必要があります。log4j一部の環境ではコンソールまたはファイルシステムへの出力が禁止されている場合があるため、はデフォルト設定を提供しません。

デバッグ中

デバッグでは、-Dlog4j.debug=trueパラメータを使用してみてください。

の構成 log4j.properties

のサンプル構成log4j.properties

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN

複数のアペンダーを使用する別の構成ファイルを次に示します。

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

Apache Solr

Solrを使用している場合<solr>/example/resources/log4j.propertiesは、クラスパス上の場所にコピーします。

log4j.propertiesSolrからの設定例は次のようになります。

#  Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n

log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

以下も参照してください。


13

ここでの回答のほとんどは、log4j.propertiesファイルを正しい場所に配置することを提案しました(Mavenプロジェクトの場合、ファイルはsrc/main/resources

しかし、私にとっての問題は、私のlog4j.properties設定が正しくないことです。これは私にとってうまくいくサンプルです、あなたは最初にそれを試すことができます。

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

1
log4jが「ファイルが見つかりません」と「ファイル内の不完全な仕様」を同じエラーであると見なしているという事実は、時間の浪費です。
エド・ノリス

1
私にとっては、これが最良の答えです。私は投票して、あなたの答えにいくつかの説明を加えました。
schlebe

私にとって最良の答え!!!
nosequeweaponer

8

前に説明したように、2つのアプローチがあります。

まず、このメソッドをメインメソッドに追加するだけです。

BasicConfigurator.configure();

2番目のアプローチは、この標準のlog4j.propertiesファイルをクラスパスに追加することです。

2番目のアプローチをとっている間、ファイルを適切に初期化することを確認する必要があります。

Properties props = new Properties();
props.load(new FileInputStream("log4j property file path"));
props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");

ログファイルを保存するために必要なフォルダを作成してください。


私は同じ問題を抱えていて、BasicConfigurator.configure();を使用しました。mainメソッドで、コードは適切に実行されています。
Surabhi Pandey 2016

7

あなたは使うLoggerメッセージをログに記録するコード内。Appender付加オブジェクトであるLogger特定のターゲットにメッセージを書き込むこと。ありFileAppender、テキストファイルやへの書き込みにConsoleAppenderコンソールへの書き込みには。さらにヘルプが必要な場合は、ロガーとアペンダーのセットアップのコードを表示する必要があります。

ロガーとアペンダーの相互作用の理解を深めるには、チュートリアルをお読みください。


6

プロパティファイルが正しく設定されていることを確認します。また、コンパイラーがプロパティファイルを見つけられないようです。pomで次のように設定できます(mavenプロジェクトを使用する場合のみ)。

<build>
       <sourceDirectory> src/main/java</sourceDirectory>
       <testSourceDirectory> src/test/java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >

この!答えを見つけるのに何時間も費やしました。私のケースコードはLinuxでうまく機能しますが、Windows(同じNB IDE)でこのエラーが発生し、上記のすべてのソリューションが機能しません!
Tiana987642 2017年

5

同じエラーが発生します。このエラーメッセージにつながる問題:

log4jを構成する前に、ロガーを使用するオブジェクトをいくつか作成します。

Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);

解決策:mainメソッドの最初にlog4jを構成します。

PropertyConfigurator.configure(xmlLog4JConfigFile); 
// or BasicConfigurator.configure(); if you dont have a config file

どうもありがとうございます!!!誰もがSpringやTomcat、あるいは設定を初期化するものを想定しています。
Windgazer

3

log4j jarファイルまたはJavaコードがlog4j構成ファイルを探す場所を理解する必要があると思います。

src/main/resources/log4j.propertiesEclipseパスです。それらを適切な場所に配置すると、コード内で絶対パスをハードコードする必要がなくなります。

そのための私の記事とサンプルソリューションをお読み くださいhttp://askyourquestions.info/2016/03/27/how-to-see-where-the-log-is-logger-in-slf4j/


3

これが発生するもう1つの理由は(RCP4で)、ターゲットファイルで複数のロギングフレームワークを使用していることです。例として、ターゲットファイルのコンテンツタブでslf4j、log4j、ch.qos.logback.slf4jの組み合わせを使用した場合に発生します。


3

次のコードを最初のコードとして追加します。

Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);

2

私の場合、エラーはフラグ「加算性」でした。ルートプロジェクトパッケージに対して「false」の場合、子パッケージにはアペンダーがなく、「アペンダーが見つかりません」というエラーが表示されます。


2

JUnitテストクラスを実行しようとしたときにも、同じ問題に直面しました。

この問題は、src / test / resourcesフォルダーにlog4j.propertiesファイルを手動で追加した後に解決されました。

以下のコードをlog4j.propertiesファイルに追加すると、問題が解決しました。

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

1

intellij 12でmavenを使用して実行可能jarをビルドしようとしたときに、この問題に遭遇しました。Javaマニフェストファイルにクラスパスが含まれていないため、ルートレベル(ここで、 jarファイルが実行された。)

参考までに、私はロガーを次のように取得していました:

Logger log = LogManager.getLogger(MyClassIWantedToLogFrom.class);

そして、これを含むpomファイルで動作させることができました:

         <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-5</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath> 
                        <mainClass>com.mycompany.mainPackage.mainClass</mainClass>
                    </manifest>
                    <manifestEntries>
                        <Class-Path>.</Class-Path> <!-- need to add current directory to classpath properties files can be found -->
                    </manifestEntries>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

1

プロジェクトがEclipseで開いていることを確認してから、Eclipseの上部にある[実行]メニューをクリックし、次をクリックします。

  1. 走る

  2. 実行構成

  3. クラスパス(タブ)

  4. ユーザーエントリー

  5. 右側に瓶を追加

  6. log4j jarファイルを追加

  7. 申し込む

  8. 走る

エラーメッセージは表示されなくなります。


1

その理由はstatic、いくつかの単語の欠如である可能性があります:

final static Logger logging = Logger.getLogger(ProcessorTest.class);

ロガーをインスタンスフィールドにすると、まさにこの警告が表示されます。

No appenders could be found for logger (org.apache.kafka.producer.Sender)

さらに悪いことに、警告ProcessorTestは間違いがどこにあるかではなく、問題の原因としてまったく異なるクラス(送信者)を指しています。そのクラスには正しいセットロガーがあり、変更する必要はありません。何年もの間問題を探すことができました!


1

log4j2を使用すると、同じ問題に直面しました。私の問題は間違った依存ライブラリを使用することによって引き起こされます:

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <scope>runtime</scope>
    </dependency>

代わりに、私は使用する必要があります:

<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <scope>runtime</scope>
    </dependency>

私の場合、「resources」ディレクトリにlog4j2.xmlが定義されており、それを使用するように指定されています。

System.setProperty("log4j.configurationFile", "log4j2.xml");

1

Log4Jは、Log4j Javaコードがプログラムに最初のログ行を作成するために検索しているときに、この警告メッセージを表示します。

この時点で、Log4jは2つのことを行います

  1. log4j.propertiesファイルを見つけるために検索します
  2. 検索してアペンダー定義をインスタンス化します log4j.properties

ファイルlog4Jが見つからない場合、log4j.propertiesまたはで宣言されたアペンダーがファイルのlog4j.rootlogger他の場所で定義されていない場合log4j.properties、警告メッセージが表示されます。

注意:プロパティファイルの内容は正しい必要があります。

次の内容は正しくありません

log4j.rootLogger=file

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false

fileアペンダーはLOWER-CASEで宣言されているためlog4j.rootlogger文と、UPPER-CASEを使用してlog4j.appender文で定義されました!

正しいファイルは

log4j.rootLogger=FILE

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false

MAVENを使用する場合は、log4j.propertiesファイルを src/main/resources、MAVENビルドを開始する。

次に、Log4j.propertiesファイルがコピーされます target/classesフォルダーにます。

Log4J log4j.propertiestarget/classes!で見つけたファイルを使用します。


1

私もこの問題を抱えていました。IntelliJ IDEAでリソースディレクトリをマークするのを忘れた

  1. ディレクトリを右クリック
  2. としてディレクトリをマーク
  3. リソースルート

1

Eclipseを使用していて、すべてが事前に正常に機能した後、この問題が突然発生した場合は、にアクセスしてみてくださいProject - Clean - Clean


0

ファイルがにあるにもかかわらず、EclipseからJUnitテストをlog4j.properties実行すると、私のEclipseインストールが見つかりませんでした。src/test/resources

その理由は、Eclipse(またはことだったのM2eコネクタ)からコンテンツをコピーしませんでしたsrc/test/resources期待出力フォルダにtarget/test-classes-根本的な原因は、そのプロジェクトのプロパティで下にあったJavaのビルド・パス ] - > [ ソース ]タブ- > [ ビルド・パス上のソースフォルダ - > のsrc / test / resources、どういうわけかExcluded: **エントリがありました。除外したものを削除しましたエントリ。

または、手動でにコピーsrc/test/resources/log4j.propertiesすることもできますtarget/test-classes/log4j.properties


0

log4j.propertiesが実際にクラスパス上にある場合、Spring Bootを使用してアプリサーバーにデプロイするWARファイルを作成し、web.xmlSpring Bootの自動構成を優先してファイルを省略し、ログメッセージをまったく取得しないため、明示的に行う必要がありますLog4jを構成します。Log4j 1.2.xを使用していると仮定します。

public class AppConfig extends SpringBootServletInitializer {

    public static void main( String[] args ) {
        // Launch the application
        ConfigurableApplicationContext context = SpringApplication.run( AppConfig.class, args );
    }

    @Override
    protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
        InputStream log4j = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
        PropertyConfigurator.configure(log4j);
        return application;
    }

// Other beans as required...
}

0

多分Javaのビルドパスにlog4jを含むreleventプロジェクトを追加します。Eclipseを使用してmahoutプロジェクトでこの問題に遭遇したとき、私はmahout_h2oをそれに追加しました、それは機能します!


0

多くのプロジェクトと一緒に作業すると、スタイルの問題に直面する可能性があります。

* 1つのlof4j.propertiesファイルが必要で、このファイルは他のプロジェクトのログプロパティに含まれています。

*プロジェクトがLinux OSで機能している場合、log4jプロパティファイルをsrcパスに配置することを試みることができるほか、他のプロジェクトのライブラリとlog4.propertiesファイルを1つのフォルダーの下のクラスパス上の場所に置くことができます。


0

最初のインポート:

 import org.apache.log4j.PropertyConfigurator;

次に、以下のコードをmainメソッドに追加します。

String log4jConfPath ="path to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);

パスにファイルを作成し、 そのファイルに以下のコードを追加します。

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

0

このサイトのソリューションは私のために働きましたhttps://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/。log4jから警告がまったく表示されなくなりました

これをsrc / main / resourcesに置いたlog4j.propertiesファイルに入れました

# This sets the global logging level and specifies the appenders
log4j.rootLogger=INFO, theConsoleAppender

# settings for the console appender
log4j.appender.theConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.theConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.theConsoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

0

まず最初に、log4j.propertiesファイルを作成します。

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

src / main / resources /に配置します

その後、次の2つの依存関係を使用します。

<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>

この最終的な依存関係をPOMファイルに追加する必要があります。

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

0

log4j JVM引数Dlog4j.configurationを検討してください。

一般に:

log4j構成ファイルを指すJVM引数を追加します。構文は次のとおりです。

java [ options ] -jar file.jar [ arguments ]

実際のコマンドラインのサンプルは次のようになります。

java -Dlog4j.configuration=conf/log4j.xml -jar myJarFile.jar myArg1 myArg2

IntelliJ IDEユーザーの場合:

1.Run/Debug Configurations
2.Edit configurations...
3.VM options
4.Enter the same value also starting with "-D"

チップ:

1.Eclipse IDEユーザーは同等のアプローチを見つける

2.実行/デバッグ構成エディターの場合、当初は、特定の実行可能ファイルがそこにない可能性が非常に高いです。現在作業しているプロジェクトのサイズによっては、ディレクトリをナビゲートしてそれを見つけるのは不愉快な場合があります。実行結果が何であれ、実行/デバッグ構成に進む前にファイルを1回実行/実行(クリックして再生)するだけで、面倒は少なくなります。

3.作業ディレクトリ、相対パス、クラスパスに注意してください。


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