web-dev-qa-db-ja.com

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

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.

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

310
maximus

この log4jの簡単な紹介 ガイドは少し古くなっていますがまだ有効です。

そのガイドはあなたにロガーとアペンダを使う方法についてあなたにいくらかの情報を与えるでしょう。


あなたがうまく行けるようにするために、あなたはあなたがとれることができる2つの簡単なアプローチがあります。

1つ目は、この行をメインメソッドに追加することです。

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
390
maba

EclipseのClasspathにlog4j.propertiesファイルの場所を追加する必要があるようです。

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

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

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

68
JDJ

迅速な解決策:

  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
    
37
lancerex

これは単なる警告です。

固定

これは、デフォルトの設定ファイルlog4j.propertieslog4j.xmlが見つからず、アプリケーションが明示的な設定を行わない場合に発生します。

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

必要に応じて、Javaオプション-Dlog4j.configuration=file:///path/to/log4j.propertiesを設定します。

log4jは、デフォルトの設定ファイルを見つけるためにThread.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 クラスパス の場所にコピーします。

Solrのlog4j.propertiesの設定例は以下のようになります。

#  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

また見なさい:

31
kenorb

ここでの回答のほとんどは、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
7
Searene

メッセージを記録するには、コード内でLoggerを使用します。 Appenderは、メッセージを特定のターゲットに書き込むためにLoggerに追加されたObjectです。テキストファイルに書き込むためのFileAppenderまたはコンソールに書き込むためのConsoleAppenderがあります。あなたはより多くの助けのためにロガーとアペンダーセットアップのあなたのコードを示す必要があります。

loggerとAppenderの相互作用の理解を深めるために チュートリアル を読んでください。

7
Simulant

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

1つ目は、この行をメインメソッドに追加することです。

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");

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

7
AkashK

私は同じエラーが出ます。ここにこのエラーメッセージをもたらす問題:

Log4jを設定する前に、Loggerを使用するオブジェクトをいくつか作成します。

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

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

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

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

<build>
       <sourceDirectory> src/main/Java</sourceDirectory>
       <testSourceDirectory> src/test/Java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >
4
belvey

Log4j jarファイルまたはJavaコードがlog4j構成ファイルを探す場所を理解しておく必要があります。

src/main/resources/log4j.propertiesはEclipseのパスです。絶対パスをコードでハードコードする必要がないように、それらを適切な場所に配置してください。

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

3
Jin Thakur

最初のコードとして以下を追加してください。

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

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

2
ekjcfn3902039

私の場合、エラーはフラグ " additivity "でした。ルートプロジェクトパッケージで "false"の場合、子パッケージにはアペンダがなくなり、 " アペンダが見つかりません "エラーが表示されます。

2
Antonio Martin

私は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
John Zhang

理由はいくつかの単語staticの欠如かもしれません:

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

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

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

さらに悪いことに、警告は、間違いがあるProcessorTestではなく、問題の原因としての絶対に異なるクラス(Sender)を示しています。 それ classは正しいset loggerを持っているので変更は不要です。私たちは年齢の問題を探すことができました!

1
Gangnus

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

現時点で、Log4jは2つのことをしています

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

log4Jlog4j.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 appenderはlog4j.rootloggerステートメントのLOWER-CASEで宣言され、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.propertiesにあるtarget/classesファイルを使用します。

1
schlebe

私はintellij 12でmavenを使って実行可能なjarファイルを構築しようとしたときにこの問題に遭遇しました。 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
jmort

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

  1. 実行する

  2. 実行構成

  3. クラスパス(タブ)

  4. ユーザエントリ

  5. 右側にjarを追加

  6. log4j jarファイルを追加

  7. 適用する

  8. 実行する

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

1
Varaj Vignesh

このサイトの解決策は私のために働いた https://crunchify.com/Java-how-to-configure-log4j-logger-property-correctly/ 。 log4jからはまったく警告が表示されない

これをlog4j.propertiesファイルに入れて、src/main/resourcesに入れます。

# 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
ihossain

たくさんのプロジェクトと一緒に仕事をしていると、スタイルの問題に直面するかもしれません。

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

*プロジェクトが動作しているときにlog4jプロパティファイルをsrcパスに入れることを試みることができます。

0
yasin

Eclipseから JUnit testsを実行すると、私のEclipseインストールはlog4j.propertiesを見つけることができませんでした、たとえファイルがsrc/test/resourcesにあったとしても。

その理由は、Eclipse(または m2e コネクタ)がsrc/test/resourcesから予期される出力フォルダtarget/test-classesにコンテンツをコピーしなかったためです。 - 根本的な原因は、 Java Build Path - > Sourceの下のプロジェクトのプロパティです。 tab - > ビルドパスのソースフォルダー - > src/test/resources 、どういうわけかExcluded: **エントリーがありました。 除外 エントリを削除しました。

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

0
Abdull

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
0

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

  1. ディレクトリを右クリックします
  2. ディレクトリにマークを付ける
  3. リソースルート
0
Sadap

log4j.propertiesが実際にクラスパスにある場合は、Spring Bootを使用してアプリケーションサーバーへのデプロイ用のWARファイルを作成し、Spring Bootの自動設定を優先してweb.xmlファイルを省略し、ログメッセージを取得しません。 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
Brian Schalme

おそらく、関連するプロジェクトのJavaビルドパスにlog4jが含まれていて、Eclipseを使用してmahoutプロジェクトでこの問題に遭遇したときにmahout_h2oを追加しても問題ありません。

0
NightWind

最初のインポート:

 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
himansug