2011-09-12 59 views
5

我使用Log4J來登錄SBT。在配置文件中,我已經爲根節點定義了TRACE級別。當我運行該項目(sbt run)時,所有調試輸出顯示正確。但是當我運行測試(sbt test)時,根本沒有輸出。我需要將該類插入到配置中以查看輸出。當使用scalatest時沒有Log4J在sbt輸出

該測試是以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" 
    } 
} 

有沒有人有一個線索,爲什麼發生這種情況以及如何阻止它?

+0

如果試圖進入sbt控制檯('sbt'),然後運行測試('test'),並_immediatelly_嘗試'最後測試',它是否顯示輸出? –

回答

0

(不幸的是我失去了我的帳戶,這張貼了這個問題:-(。但是,這也是某種形式的答案。)

進一步的調查表明,在代碼中的一些點,爲compile.Compiler記錄器級別手動設置到INFO。當我刪除這條語句時,一切正常。

令人驚訝的事實是,在一個測試中設置級別還會導致所有以下測試採用該日誌記錄級別,這很難理解,因爲我認爲每次新測試都會重新載入配置文件。

但是,在瀏覽一些文檔後,我發現加載配置文件時實際配置不會重置。要在加載配置之前執行此操作,必須執行BasicConfigurator.resetConfiguration()。有了這個,一切都按預期工作。

相關問題