2012-07-22 30 views

回答

21

首先,您可能會喜歡一些爲什麼在測試模式下禁用日誌記錄的背景知識。這是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" 
+0

你如何應對'SLF4J :類路徑包含多個SLF4J綁定。 – Rajish 2012-07-25 22:50:40

+0

@Rajish我不處理它,因爲這只是一個臨時的解決方法。對我來說,這個警告沒有給出任何問題。它會給你帶來什麼問題嗎? – rintcius 2012-08-20 15:43:02

+0

@printcius感謝您的解決方法!我使用java,據我所知我可以混合使用scala代碼。我把它作爲一個scala文件添加到我的java項目中,但它似乎不起作用。看看你的代碼,我應該能夠像往常一樣記錄Logger.debug(「調試」)的想法?我也添加了依賴關係。 – 2012-09-15 13:27:04

3

如果你看看播放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 
+1

你真的嘗試過嗎?因爲從我的經驗來看,這是行不通的。 – Rajish 2013-01-07 23:36:28

+0

是的。它爲我工作。 – 2013-01-08 12:00:50

5

我創建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

瞧!在測試中記錄數據。它確實會導致內存泄漏,但在開發過程中非常有用。

7

如果您使用FakeApplication,你可以通過一些配置信息:

FakeApplication(additionalConfiguration = Map(
    "logger.application" -> "DEBUG" 
)) 

這限制記錄器輸出到調試和更高的輸出。

我很驚訝地發現設置是「粘性」的。如果早期測試使用FakeApplication,則以後不使用FakeApplication的測試仍將使用相同的日誌記錄級別。

4

如果您使用sbt來運行測試(默認情況下會執行測試),您可以在Test任務中設置javaOptions來控制所用的日誌記錄配置。

例如,在項目/ Build.scala:

javaOptions in Test  += "-Dlogger.file=conf/test-logger.xml" 

更多關於測試logger.xml文件的語法在這裏:

http://logback.qos.ch/manual/configuration.html

+1

從2.3.2開始,這不再起作用。使用上面的代碼不會在默認項目中編譯。在Test + = Tests.Argument(「 - Dlogger.file = conf/test-logger.xml」)中設置testOptions來配置日誌記錄,但根本沒有記錄出現在單元測試中。 – 2014-08-07 12:01:21

+0

我編輯了答案,刪除play.Project在2.3.x中被刪除,但其餘的仍然有效 - 我們目前正在使用它在我們的項目中。你在test-logger.xml中有什麼? – jazmit 2014-08-10 17:11:50

+0

現在,您已經刪除了'play.Project'。感謝更新@jamesinchina – 2014-08-11 10:10:42

相關問題