28

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

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

4

5 回答 5

21

首先,您可能喜欢一些背景,为什么在测试模式下禁用日志记录。这是 Guillame Bort 在游戏论坛中对问题的回答(请参阅此线程):

记录器暂时在测试模式下被禁用,因为它在运行测试时导致巨大的 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"
于 2012-07-24T16:09:29.827 回答
9

如果你使用 FakeApplication,你可以传递一些配置信息:

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

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

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

于 2014-01-31T19:11:23.427 回答
6

我在 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

瞧!在测试中记录数据。它确实会导致内存泄漏,但在开发过程中是无价的。

于 2013-02-01T21:46:27.960 回答
5

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

例如,在 project/Build.scala 中:

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

更多关于 test-logger.xml 文件的语法在这里:

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

于 2014-04-24T09:08:48.103 回答
3

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

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

示例日志记录配置(项目根目录中的 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
于 2012-12-31T14:01:50.020 回答