Jak wymusić Loggera.Debuguj wyjście w Play! testy framework Spec 2?

Domyślnie wszystkie wyjście Logger, widoczne podczas uruchamiania aplikacji, jest wyciszone podczas testowania aplikacji.

Jak wymusić debugs, infos itp. do pokazania w specs2 raportach?

Author: Rajish, 2012-07-22

5 answers

Po pierwsze, możesz polubić trochę tła, dlaczego logowanie jest wyłączone w trybie testowym. To była odpowiedź Guillame Bort na pytanie na forum play (Zobacz ten wątek):

Logger jest na razie wyłączony w trybie testowym, ponieważ powodował ogromny wyciek przestrzeni PermGen podczas testów. Ale pracujemy, aby uruchomić testy w rozwidlonym JVM, więc wkrótce włączymy go ponownie.

Jako obejście, stworzyłem swój własny logger w taki sposób (Kod 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)
    }
  }
}

I Nie wiem, jak ten kod zachowuje się w odniesieniu do przecieku PermGen w ogóle, ale jak na razie nie miałem tego problemu. Aby to działało, musisz dodać zależność:

"org.slf4j" % "slf4j-simple" % "1.6.4"
 21
Author: rintcius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-24 16:09:29

Jeśli używasz FakeApplication, możesz przekazać pewne informacje o konfiguracji:

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

Które ogranicza wyjście LOGGERA do debugowania i wyższego wyjścia.

Byłem zaskoczony, gdy zauważyłem, że ustawienie jest "lepkie". Jeśli wczesny test wykorzystuje FakeApplication, późniejszy test, który nie używa FakeApplication, nadal będzie używał tego samego poziomu logowania.

 7
Author: bwbecker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 11:16:57

Stworzyłem logger.plik xml pod conf taki jak ten:

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

Następnie uruchamiam moje środowisko gry następującym poleceniem:

Play-Dlogger.file=conf / logger.xml

Voila! Logowanie danych w teście. Prowadzi to do wycieków pamięci, ale jest nieoceniona podczas rozwoju.
 5
Author: John Kelvie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-01 21:46:27

Jeśli używasz SBT do uruchamiania testów (co play robi domyślnie), możesz ustawić javaOptions w zadaniu testowym, aby kontrolować używaną konfigurację logowania.

Np. w project / Build.scala:

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

Więcej o składni test-loggera.plik xml tutaj:

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

 4
Author: jazmit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-10 17:10:23

Jeśli spojrzysz na Play Logger source , zobaczysz, że logowanie jest wyłączone w trybie testowym.

Jeśli naprawdę chcesz logowania, możesz utworzyć plik konfiguracyjny logowania do testów i przekazać go do odtwarzania jako właściwość systemową " logger.plik".

Przykładowa konfiguracja logowania (test-logger.plik xml w korzeniu projektu):

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

Testy:

JAVA_OPTS="-Dlogger.file=test-logger.xml" play test
 3
Author: Luka Zakrajšek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-31 14:01:50