2010-12-31 24 views
58

突然これはJUnitテスト中に起こります。すべてが機能していました。私は新しいテストを書きましたが、このエラーが発生しました。私がそれを元に戻すと、それは消えません。何故ですか?SpringJUnit4ClassRunnerのlog4j.propertiesの設定方法は?

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

答えて

66

あなたが書いた新しいテスト(直接または間接的には)Log4jのを使用してログインしクラスを使用します。

このログが正しく機能するようにLog4Jを構成する必要があります。

log4j.properties(またはのlog4j.xml)を入れて、あなたのテストクラスパスルートにあるファイル。

それは、デフォルトでコンソールに、このような

# 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 

# An alternative logging format: 
# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n 

など、いくつかの基本的な構成アペンダの出力を持っている必要がありますが、あなたはまた、明示的にこのように目標を設定することができます。

log4j.appender.A1.Target=System.out 

これは、すべてをリダイレクトします良いフォーマットでコンソールに出力します。詳細はこちらLog4J manual

Log4Jログは正しく構成され、この警告は消えます。

+1

でSpringJUnit4ClassRunnerを置き換えるだけで参考のために、ここでは変換パターンの参照のためのリンクを次のとおりです。http://logging.apache。 org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html – lanoxx

+0

なぜこれを行うのか説明できますか? – iLoveCamelCase

+0

project/src/test/resources/log4j.properties –

8

log4j.properties(log4j.xml)ファイルに、クラスパスのルートに少なくとも1つのアペンダーを追加します。ファイルの

内容(log4j.properties)これはWARNとしてデフォルトのログレベルでlog4jロギングを有効にし、メッセージをログに記録するためにJavaコンソールを使用します

log4j.rootLogger=WARN,A1 

# A1 is set to be a ConsoleAppender. 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n 

限りシンプルにすることができます。

3

log4j.propertiesが正しく設定されています。それは問題ではありません。しばらくして、私は問題がEclipseのIDEで "キャッシュ"に古いビルドを持ち、新しいものを作成していないことを発見しました(Maven依存問題)。私は手動でプロジェクトを構築しなければならなかったし、今はそれが動作します。

+0

こんにちはTom、この問題と回避策について詳しく説明してもらえますか?ありがとう – VLostBoy

+0

@vlostboy:そしてプロジェクトを掃除するのが助けになりませんでしたか? – user219882

+0

@vlostboy:私のために働いた解決策は、コマンドラインからビルドしていました。 'mvn clean package' – user219882

44

あなたはあなたのコード内でこのような何かを行うことができ、ファイルを気にしたくない場合は、次の

static 
{ 
    Logger rootLogger = Logger.getRootLogger(); 
    rootLogger.setLevel(Level.INFO); 
    rootLogger.addAppender(new ConsoleAppender(
       new PatternLayout("%-6r [%p] %c - %m%n"))); 
} 
+0

保存日!ありがとう@tster。 –

3

私は日食でMavenを使用していたと私は追加のコピーを持っている必要はありませんでしたルートフォルダ内のプロパティファイル

  1. オープンランダイアログの「ユーザーを選択します(再生ボタンの隣にある小さな矢印をクリックし、設定を実行するために行く)「クラスパス」タブ
  2. ゴー:あなたは日食で次の操作を行うことができます右の「詳細」ボタンをクリックしてください。
  3. 「外部フォルダを追加」ラジオボタンを選択します。
  4. 私はこれが古いですけど、私はあまりにもトラブルを抱えていたリソースフォルダ
1

を選択します。MavenとEclipseを使ったSpring 3では、ユニットテストが正しくログするために、src/test/resourcesにlog4j.xmlを置く必要がありました。テストのルートに配置することは私のためには機能しませんでした。うまくいけば、これは他人を助けることでしょう

2

私は重複したファイル(testとmainのlog4j.properties)が好きではないので、かなりたくさんのテストクラスがあり、それぞれSpringJUnit4ClassRunnerクラスで動作しますので、カスタマイズする必要があります。これは私が使用するものです。

import java.io.FileNotFoundException; 

import org.junit.runners.model.InitializationError; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.util.Log4jConfigurer; 

public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner { 

    static { 
     String log4jLocation = "classpath:log4j-oops.properties"; 
     try { 
      Log4jConfigurer.initLogging(log4jLocation); 
     } catch (FileNotFoundException ex) { 
      System.err.println("Cannot Initialize log4j at location: " + log4jLocation); 
     } 
    } 

    public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
     super(clazz); 
    } 
} 

あなたがそれを使用し、MySpringJUnit4ClassRunner

@RunWith(MySpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:conf/applicationContext.xml") 
public class TestOrderController { 
    private Logger LOG = LoggerFactory.getLogger(this.getClass()); 

    private MockMvc mockMvc; 
... 
} 
関連する問題