5

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

テストは 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>

このバージョンの構成ファイルを使用するcompile.Compilerと、Log4J 構成でそのノードのコメントを解除しない限り、のテストでログ出力が生成されません。SBT 構成ファイルでは、これらの依存関係が次のように定義されてい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"
    }
}

なぜこれが起こるのか、そしてそれを止める方法を知っている人はいますか?

4

1 に答える 1

0

(残念ながら、この質問を投稿したアカウントを失いました。:-(しかし、これはある種の回答でもあります。)

さらに調査したところ、コードのある時点で、compile.Compilerロガーのレベルが手動で に設定されていたことがわかりましたINFO。このステートメントを削除すると、すべて正常に動作します。

これに関する驚くべき事実は、1 つのテストでレベルを設定すると、その後のすべてのテストでもそのログ レベルが採用されることです。新しいテストごとに構成ファイルがリロードされると思っていたので、これは理解しにくかったです。

ただし、いくつかのドキュメントを閲覧した後、構成ファイルをロードするときに実際の構成がリセットされないことがわかりました。この動作を行うにBasicConfigurator.resetConfiguration()は、構成をロードする前に a を実行する必要があります。これにより、すべてが期待どおりに機能します。

于 2011-09-14T08:55:57.770 に答える