2011-09-12 5 views
5

私はSBTにログインするためにLog4Jを使用しています。設定ファイルでは、ルートノードのレベルをTRACEと定義しました。プロジェクト(sbt run)を実行すると、すべてのデバッグ出力が正しく表示されます。しかし、テスト(sbt test)を実行すると、出力が全く生成されません。出力を見るには、クラスを設定に挿入する必要があります。スカートを使用しているときにsbtにLog4J出力がありません

このテストはJUnitスタイルで記述されています。 Eclipseでテストを実行すると、すべてのLog4J出力が表示されます。だから、それはSBTまたはscalatestの問題であるようです。

Log4Jの設定:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.EnhancedPatternLayout"> 
     <param name="ConversionPattern" value="%-5r [%-5p] %c: %M - %m%n"/> 
    </layout> 
    </appender> 

    <appender name="asyncApp" class="org.apache.log4j.AsyncAppender"> 
    <appender-ref ref="fileApp"/> 
    </appender> 

    <appender name="fileApp" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="testlog_Compiler"/> 
    <param name="Append" value="true" /> 
    <param name="Threshold" value="ALL"/> 
    <layout class="org.apache.log4j.EnhancedPatternLayout"> 
     <param name="ConversionPattern" value="%d [%-5p] %c: %M - %m%n"/> 
    </layout> 
    </appender> 

    <appender name="fileAppTest" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="testlog_Tests"/> 
    <param name="Append" value="true" /> 
    <param name="Threshold" value="ALL"/> 
    <layout class="org.apache.log4j.EnhancedPatternLayout"> 
     <param name="ConversionPattern" value="%d [%-5p] %c: %M - %m%n"/> 
    </layout> 
    </appender> 

    <logger name="main.Main$" additivity="true"> 
    <level value="INFO" /> 
    </logger> 
<!-- 
    <logger name="compile.Compiler" additivity="true"> 
    <level value="DEBUG" /> 
    </logger> 
--> 
    <logger name="test" additivity="false"> 
    <level value="TRACE" /> 
    <appender-ref ref="stdout"/> 
    <appender-ref ref="fileAppTest"/> 
    </logger> 

    <root> 
    <priority value="TRACE"/> 
    <appender-ref ref="asyncApp"/> 
    <appender-ref ref="stdout"/> 
    </root> 

</log4j:configuration> 

私は、configファイルのこのバージョンを使用する場合、私はLog4Jの設定ファイルでそのノードのコメントを解除しない限り、compile.Compilerのテストは任意のログ出力を生成しません。 (これは単に、最小限の例です。)

class Comp2011ParentProject(info: ProjectInfo) extends DefaultProject(info) { 
    val compiler = project("compile", "compile", new Compile(_)) 
    class compiler(info: ProjectInfo) extends DefaultProject(info) with Eclipsify { 
     val scalatest = "org.scalatest" % "scalatest_2.9.0" % "1.6.1" 
     val junitInterface = "com.novocode" % "junit-interface" % "0.6" % "test->default" 
     val log4j = "log4j" % "log4j" % "1.2.16" 
     val log4jExtras = "log4j" % "apache-log4j-extras" % "1.1" 
    } 
} 

この問題が発生し、どのようにそれを止めるために、なぜ誰もが手掛かりを持っています:SBTの設定ファイルでは、これらの依存関係はcompile.Compilerのために定義されていますか?

+0

sbt console( 'sbt')を入力してテスト(' test')を実行し、_immediatelly_ '' last test'を試してみると、出力が表示されますか? –

答えて

0

は(残念ながら、私はこの質問を投稿アカウントを失った。:-(しかし、これはまた、答えのいくつかの種類である。)

さらなる調査は、コードの中でいくつかの点でcompile.Compilerロガーのレベルを手動で設定していることが示されましたINFOに。私はこの文を削除すると、すべてが正常に動作します。

これについての驚くべき事実は一つのテストでレベルを設定することも、すべての次のテストは、そのログレベルを採用する原因となるということである。私は思ったので、これは理解するのが難しかったです新しいテストごとに構成ファイルが再ロードされました。

しかし、ドキュメンテーションのサーフィンをした後、構成ファイルを読み込むときに実際の構成がリセットされないことがわかりました。この動作を行うには、構成をロードする前にBasicConfigurator.resetConfiguration()を実行する必要があります。これで、すべてが期待通りに機能します。

関連する問題