默認情況下,應用程序運行時可見的所有Logger
輸出在應用程序測試時爲靜音。如何在Play中強制使用Logger.debug輸出!框架specs2測試?
如何強制調試,信息等在specs2
報告中顯示?
默認情況下,應用程序運行時可見的所有Logger
輸出在應用程序測試時爲靜音。如何在Play中強制使用Logger.debug輸出!框架specs2測試?
如何強制調試,信息等在specs2
報告中顯示?
首先,您可能會喜歡一些爲什麼在測試模式下禁用日誌記錄的背景知識。這是Guillame BORT的回答在多玩論壇的一個問題(見this thread):
該記錄儀在測試模式下關閉了,因爲現在運行測試時它是引起 巨大的PermGen空間泄漏。但是我們正在努力在分叉的JVM上運行 測試,所以我們將很快再次啓用它。
作爲一種變通方法,我創建了自己的記錄是這樣的(Scala代碼):
import play.api.{Play, LoggerLike, Logger}
import org.slf4j.LoggerFactory
import org.slf4j.impl.SimpleLoggerFactory
object MyLogger extends LoggerLike {
val factory = if (Play.isTest(Play.current)) {
new SimpleLoggerFactory()
} else {
LoggerFactory.getILoggerFactory
}
val redirectDebugToInfo = factory.isInstanceOf[SimpleLoggerFactory]
val logger = factory.getLogger("application")
def apply(name: String): Logger = new Logger(factory.getLogger(name))
def apply[T](clazz: Class[T]): Logger = new Logger(factory.getLogger(clazz.getCanonicalName))
// this method is to make debug statements to show up in test mode
override def debug(m: => String) = {
if (redirectDebugToInfo) {
info(m)
} else {
super.debug(m)
}
}
}
我不知道這個代碼的行爲有關常規PermGen的泄漏,但到目前爲止,我沒沒有那個問題。 爲了使它工作,你需要添加這種依賴性:
"org.slf4j" % "slf4j-simple" % "1.6.4"
如果你看看播放Logger source,你會看到,記錄在測試模式下被禁用。
如果您確實需要日誌記錄,則可以創建日誌配置文件進行測試,並將其作爲系統屬性「logger.file」傳遞給Play。
例日誌配置(在項目根測試logger.xml文件):
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />
<logger name="application" level="INFO">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern>
</encoder>
</appender>
</logger>
</configuration>
運行測試:
JAVA_OPTS="-Dlogger.file=test-logger.xml" play test
你真的嘗試過嗎?因爲從我的經驗來看,這是行不通的。 – Rajish 2013-01-07 23:36:28
是的。它爲我工作。 – 2013-01-08 12:00:50
我創建conf下一個logger.xml文件如此:
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern></encoder>
</appender>
<logger name="play" level="ERROR" />
<logger name="application" level="INFO" />
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
</configuration>
然後我用下面的命令啓動我的播放環境:
發揮-Dlogger.file =的conf/logger.xml
瞧!在測試中記錄數據。它確實會導致內存泄漏,但在開發過程中非常有用。
如果您使用FakeApplication,你可以通過一些配置信息:
FakeApplication(additionalConfiguration = Map(
"logger.application" -> "DEBUG"
))
這限制記錄器輸出到調試和更高的輸出。
我很驚訝地發現設置是「粘性」的。如果早期測試使用FakeApplication,則以後不使用FakeApplication的測試仍將使用相同的日誌記錄級別。
如果您使用sbt來運行測試(默認情況下會執行測試),您可以在Test任務中設置javaOptions來控制所用的日誌記錄配置。
例如,在項目/ Build.scala:
javaOptions in Test += "-Dlogger.file=conf/test-logger.xml"
更多關於測試logger.xml文件的語法在這裏:
從2.3.2開始,這不再起作用。使用上面的代碼不會在默認項目中編譯。在Test + = Tests.Argument(「 - Dlogger.file = conf/test-logger.xml」)中設置testOptions來配置日誌記錄,但根本沒有記錄出現在單元測試中。 – 2014-08-07 12:01:21
我編輯了答案,刪除play.Project在2.3.x中被刪除,但其餘的仍然有效 - 我們目前正在使用它在我們的項目中。你在test-logger.xml中有什麼? – jazmit 2014-08-10 17:11:50
現在,您已經刪除了'play.Project'。感謝更新@jamesinchina – 2014-08-11 10:10:42
你如何應對'SLF4J :類路徑包含多個SLF4J綁定。 – Rajish 2012-07-25 22:50:40
@Rajish我不處理它,因爲這只是一個臨時的解決方法。對我來說,這個警告沒有給出任何問題。它會給你帶來什麼問題嗎? – rintcius 2012-08-20 15:43:02
@printcius感謝您的解決方法!我使用java,據我所知我可以混合使用scala代碼。我把它作爲一個scala文件添加到我的java項目中,但它似乎不起作用。看看你的代碼,我應該能夠像往常一樣記錄Logger.debug(「調試」)的想法?我也添加了依賴關係。 – 2012-09-15 13:27:04