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.
これらの警告はどういう意味ですか?ここにアペンダーは何ですか?
この 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
EclipseのClasspathにlog4j.properties
ファイルの場所を追加する必要があるようです。
プロジェクトがEclipseで開いていることを確認してから、Eclipseの上部にある「実行」メニューをクリックして、以下をクリックします。
エラーメッセージは表示されなくなります。
迅速な解決策:
main関数にコードを追加します :
String log4jConfPath = "/path/to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);
/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
とlog4j.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
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
また見なさい:
ここでの回答のほとんどは、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
メッセージを記録するには、コード内でLogger
を使用します。 Appender
は、メッセージを特定のターゲットに書き込むためにLogger
に追加されたObjectです。テキストファイルに書き込むためのFileAppender
またはコンソールに書き込むためのConsoleAppender
があります。あなたはより多くの助けのためにロガーとアペンダーセットアップのあなたのコードを示す必要があります。
loggerとAppenderの相互作用の理解を深めるために チュートリアル を読んでください。
先に説明したように、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");
ログファイルを保存するために必要なフォルダを必ず作成してください。
私は同じエラーが出ます。ここにこのエラーメッセージをもたらす問題:
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
プロパティファイルが正しく設定されていることを確認してください。繰り返しますが、コンパイラがプロパティファイルを見つけることができないようです、pomで次のように設定できます(mavenプロジェクトを使用する場合のみ)。
<build>
<sourceDirectory> src/main/Java</sourceDirectory>
<testSourceDirectory> src/test/Java</testSourceDirectory>
<resources>
<resource>
<directory>resources</directory>
</resource>
</resources>
</build >
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/ /
最初のコードとして以下を追加してください。
Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);
これが(RCP4で)起こるかもしれないもう一つの理由はあなたがあなたのターゲットファイルで複数のロギングフレームワークを使用しているということです。例として、これは、ターゲットファイルのコンテンツタブでslf4j、log4j、およびch.qos.logback.slf4jの組み合わせを使用した場合に発生します。
私の場合、エラーはフラグ " additivity "でした。ルートプロジェクトパッケージで "false"の場合、子パッケージにはアペンダがなくなり、 " アペンダが見つかりません "エラーが表示されます。
私は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");
理由はいくつかの単語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を持っているので変更は不要です。私たちは年齢の問題を探すことができました!
Log4Jは、Log4j Javaコードがプログラム内に最初のログ行を作成しようとしているときに、この警告メッセージを表示します。
現時点で、Log4jは2つのことをしています
log4j.properties
ファイルを見つけるために検索します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
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
ファイルを使用します。
私は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>
プロジェクトがEclipseで開いていることを確認してから、Eclipseの上部にある「実行」メニューをクリックして、以下をクリックします。
実行する
実行構成
クラスパス(タブ)
ユーザエントリ
右側にjarを追加
log4j jarファイルを追加
適用する
実行する
エラーメッセージは表示されなくなります。
このサイトの解決策は私のために働いた 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
たくさんのプロジェクトと一緒に仕事をしていると、スタイルの問題に直面するかもしれません。
* 1つのlof4j.propertiesファイルが必要です。このファイルは他のプロジェクトのログプロパティに含まれています。
*プロジェクトが動作しているときにlog4jプロパティファイルをsrcパスに入れることを試みることができます。
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.properties
をtarget/test-classes/log4j.properties
にコピーすることもできます。
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
私もこの問題を抱えていました。 IntelliJ IDEAでリソースディレクトリをマークするのを忘れました
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...
}
おそらく、関連するプロジェクトのJavaビルドパスにlog4jが含まれていて、Eclipseを使用してmahoutプロジェクトでこの問題に遭遇したときにmahout_h2oを追加しても問題ありません。
最初のインポート:
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