如何强制Logger.debug输出播放! 框架specs2测试?(How to force L

2019-06-26 11:34发布

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

如何强制(1)调试,在显示的相关信息等。 specs2报告?

Answer 1:

首先,你可能也会喜欢的背景,为什么记录在测试模式下被禁用。 这是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"


Answer 2:

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

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

这限制了记录器输出到调试和更高的输出。

我很惊讶地看到,设置为“粘性”。 如果早期的测试使用FakeApplication,不使用FakeApplication仍然会使用相同的日志记录级别后面的测试。



Answer 3:

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

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



Answer 4:

如果您使用SBT运行测试(其中扮演默认完成了),你可以在测试任务设置javaOptions控制使用的日志记录配置。

例如,在项目/ Build.scala:

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

更多关于这里的测试logger.xml文件的语法:

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



Answer 5:

如果你看看播放记录器源 ,你会看到,记录在测试模式下被禁用。

如果你真的想记录,您可以创建测试日志配置文件,并把它传递给扮演系统属性“logger.file”。

例如日志配置(在项目根测试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


文章来源: How to force Logger.debug output in Play! framework specs2 tests?