如何在Play中强制使用Logger.debug输出!框架specs2测试?

时间:2012-07-22 01:18:10

标签: scala playframework playframework-2.0 specs2

默认情况下,在应用程序运行时可见的所有Logger输出在测试应用程序时都是静音。

如何强制调试,信息等显示在specs2报告中?

5 个答案:

答案 0 :(得分: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"

答案 1 :(得分:8)

如果您正在使用FakeApplication,则可以传递一些配置信息:

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

将LOGGER输出限制为调试和更高输出。

我很惊讶地发现这个设置是“粘性的”。如果早期测试使用FakeApplication,则稍后不使用FakeApplication的测试仍将使用相同的日志记录级别。

答案 2 :(得分: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

瞧!在测试中记录数据。它确实会导致内存泄漏,但在开发过程中非常宝贵。

答案 3 :(得分:4)

如果您正在使用sbt运行测试(默认情况下播放),您可以在Test任务中设置javaOptions以控制使用的日志配置。

例如,在project / Build.scala中:

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

有关test-logger.xml文件语法的更多信息,请访问:

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

答案 4 :(得分:3)

如果查看Play Logger source,您将看到在测试模式下禁用了日志记录。

如果您真的想要记录,可以创建用于测试的记录配置文件,并将其传递给Play作为系统属性&#34; logger.file&#34;。

示例日志记录配置(项目根目录中的test-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