5

我正在使用 Log4J 登录 SBT。在配置文件中,我定义了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. 当我删除此语句时,一切正常。

令人惊讶的事实是,在一个测试中设置级别也会导致以下所有测试都采用该日志记录级别。这很难理解,因为我认为每次新测试都会重新加载配置文件。

但是,在浏览了一些文档后,我发现加载配置文件时实际配置并未重置。要具有此行为,BasicConfigurator.resetConfiguration()必须在加载配置之前执行。有了这个,一切都按预期工作。

于 2011-09-14T08:55:57.770 回答