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

Raj*_*ish 26 scala playframework specs2 playframework-2.0

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

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

rin*_*ius 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)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我不知道这个代码在PermGen漏洞方面的表现如何,但到目前为止我没有遇到这个问题.要使其工作,您需要添加此依赖项:

"org.slf4j" % "slf4j-simple" % "1.6.4"
Run Code Online (Sandbox Code Playgroud)


bwb*_*ker 9

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

  FakeApplication(additionalConfiguration = Map(
    "logger.application" -> "DEBUG"
  ))
Run Code Online (Sandbox Code Playgroud)

这限制了LOGGER输出到调试和更高的输出.

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


Joh*_*vie 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>
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令启动我的播放环境:

play -Dlogger.file = conf/logger.xml

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


jaz*_*mit 5

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

例如,在 project/Build.scala 中:

javaOptions in Test      += "-Dlogger.file=conf/test-logger.xml"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 从 2.3.2 开始,这似乎不再起作用。使用上面的代码不会在默认项目中编译。设法获取 `testOptions in Test += Tests.Argument("-Dlogger.file=conf/test-logger.xml")` 来配置日志记录,但单元测试根本没有日志记录。 (2认同)