Mic*_*rdt 5 log4j scala sbt scalatest
我正在使用Log4J登录SBT.在配置文件中,我已经定义TRACE了根节点的级别.当我运行项目(sbt run)时,所有调试输出都正确显示.但是当我运行tests(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>
Run Code Online (Sandbox Code Playgroud)
当我使用此版本的配置文件时,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"
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么会发生这种情况以及如何阻止它?
(不幸的是,我丢失了发布这个问题的帐户。:-(但这也是某种答案。)
进一步的调查表明,在代码中的某个时刻,记录器的级别compile.Compiler被手动设置为INFO。当我删除这条语句时,一切正常。
令人惊讶的事实是,在一个测试中设置级别也会导致所有后续测试采用该日志记录级别。这很难理解,因为我认为每次新测试都会重新加载配置文件。
然而,经过一些文档浏览后,我发现加载配置文件时实际配置并未重置。要实现此行为,BasicConfigurator.resetConfiguration()必须在加载配置之前执行。有了这个,一切都会按预期进行。