2012-07-22 8 views

Odpowiedz

21

Po pierwsze, może Ci się spodobać, dlaczego rejestracja jest wyłączona w trybie testowym. To była odpowiedź Guillaume Bort do pytania na forum gry (patrz this thread):

Rejestrator jest wyłączony w trybie testowym do teraz, ponieważ został powodując wyciek ogromna przestrzeń PermGen podczas uruchamiania testów. Ale pracujemy nad testami w rozwidlonej maszynie JVM, więc wkrótce włączymy ją ponownie.

Jako obejście, tworzę własny rejestrator tak (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) 
    } 
    } 
} 

nie wiem jak ten kod zachowuje się w sprawie przecieku PermGen w ogóle, ale do tej pory nie zrobił mi nie ma tego problemu. Aby pracować trzeba dodać tę zależność:

"org.slf4j" % "slf4j-simple" % "1.6.4" 
+0

Jak radzisz sobie z 'slf4j : Ścieżka klasy zawiera wiele powiązań SLF4J. Ostrzeżenie? – Rajish

+0

@Rajish Nie radzę sobie z tym, ponieważ jest to tymczasowe obejście problemu. Dla mnie ostrzeżenie nie dało żadnych problemów. Czy daje ci to jakieś problemy? – rintcius

+0

@rintcius Dzięki za obejście problemu! Używam java i o ile wiem, mogę po prostu miksować kod scala. Dodałem to jako plik scala do mojego projektu java, ale to nie działa. Patrząc na twój kod, powinienem móc logować się jak zwykle myśli Logger.debug ("debugowanie")? Dodałem również zależności. –

3

Jeśli spojrzeć na zagraj Logger source, widać, że rejestrowanie jest wyłączone w trybie testowym.

Jeśli naprawdę chcesz rejestrowanie, można utworzyć plik konfiguracji rejestrowania dla testowania i przekazać go do gry jako właściwość systemu „logger.file”.

Przykład Konfiguracja rejestrowania (pliku testowego logger.xml root 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> 

przebiegu próby:

JAVA_OPTS="-Dlogger.file=test-logger.xml" play test 
+1

Czy naprawdę tego spróbowałeś? Ponieważ z mojego doświadczenia to nie działa. – Rajish

+0

Tak. To zadziałało dla mnie. –

5

utworzonego pliku logger.xml konf takie jak to:

<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 swoje środowisko gry za pomocą następującego polecenia:

zabaw -Dlogger.file = conf/logger.xml

Voila! Rejestrowanie danych w teście. Prowadzi to do wycieków pamięci, ale jest nieocenione podczas rozwoju.

7

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

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

który ogranicza wyjście rejestratora do debugowania i wyższej wydajności.

Zaskoczyło mnie, że ustawienie jest "lepkie". Jeśli wczesny test korzysta z FakeApplication, późniejszy test, który nie korzysta z FakeApplication, nadal będzie korzystał z tego samego poziomu rejestrowania.

4

Jeśli używasz SBT aby uruchomić testy (który gra robi domyślnie), można ustawić javaOptions w zadaniu testowym kontrolować konfigurację rejestrowania używany.

Np w projekcie/Build.scala:

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

Więcej na temat składni pliku testowego logger.xml tutaj:

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

+1

To już nie działa z 2.3.2. Korzystanie z powyższego kodu nie zostanie skompilowane w domyślnym projekcie. Zarządzane, aby uzyskać 'testOptions w Test + = Tests.Argument (" - Dlogger.file = conf/test-logger.xml ")' aby skonfigurować rejestrowanie, ale w ogóle nie ma rejestracji w testach jednostkowych. –

+0

Edytowałem odpowiedź, aby usunąć odtwarzanie.Projekt, który został usunięty w wersji 2.3.x, ale pozostałe nadal działają - obecnie używamy go w naszym projekcie. Co masz w swoim pliku test-logger.xml? – jazmit

+0

Działa to teraz, gdy usunąłeś 'play.Project'. dziękuję za aktualizację @jamesinchina –