2012-07-22 7 views

Antwort

21

Zunächst möchten wir Ihnen einen Hintergrund zeigen, warum die Protokollierung im Testmodus deaktiviert ist. Dies war Guillame Bort Antwort auf eine Frage im Spiel Forum (siehe this thread):

Der Logger wird nun im Testmodus deaktiviert, da es einen großen PermGen Raum Leck verursacht wurde, wenn Tests ausgeführt werden. Aber wir arbeiten daran, Tests in einer gegabelten JVM auszuführen, so dass wir es bald wieder aktivieren werden.

Als Abhilfe kann, habe ich meine eigenen Logger wie dieser (Scala-Code):

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

Ich weiß nicht, wie dieser Code über das PermGen Leck im Allgemeinen verhält, aber so weit ich didn Habe dieses Problem nicht. Um es Sie arbeiten zu müssen, diese Abhängigkeit hinzuzufügen:

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

Wie gehen Sie mit der 'SLF4J : Klassenpfad enthält mehrere SLF4J-Bindungen.warning? – Rajish

+0

@Rajish Ich behandle es nicht, da es nur eine vorübergehende Abhilfe ist. Für mich gab die Warnung keine Probleme. Gibt es Ihnen irgendwelche Probleme? – rintcius

+0

@rintcius Danke für die Problemumgehung! Ich benutze Java und soweit ich weiß kann ich einfach Scala Code mischen. Ich habe das als Scala-Datei zu meinem Java-Projekt hinzugefügt, aber es scheint nicht zu funktionieren. Mit Blick auf Ihren Code sollte ich Logger.debug ("debug") Gedanken wie gewohnt loggen können? Ich habe auch die Abhängigkeiten hinzugefügt. –

3

Wenn Sie am Spiel schauen Logger source, sehen Sie, dass die Protokollierung im Testmodus deaktiviert ist.

Wenn Sie wirklich protokollieren möchten, können Sie eine Protokollierungskonfigurationsdatei zum Testen erstellen und als Systemeigenschaft "logger.file" an Play übergeben.

Beispiel Protokollkonfiguration (Test-logger.xml Datei in Projektstamm):

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

Laufende Tests:

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

Hast du es tatsächlich versucht? Weil es meiner Erfahrung nach nicht funktioniert. – Rajish

+0

Ja. Es hat für mich funktioniert. –

5

ich eine logger.xml Datei unter conf wie diese erstellt:

Dann starte ich meine Spielumgebung mit dem folgenden Befehl:

play -Dlogger.file = conf/logger.xml

Voila! Daten im Test protokollieren. Es führt zu Speicherlecks, ist aber während der Entwicklung von unschätzbarem Wert.

7

Wenn Sie FakeApplication verwenden, können Sie einige Konfigurationsinfos passieren:

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

Die LOGGER Ausgang zu debuggen und höherer Leistung begrenzt.

Ich war überrascht zu beobachten, dass die Einstellung "sticky" ist. Wenn ein früher Test FakeApplication verwendet, verwendet ein späterer Test, der FakeApplication nicht verwendet, immer noch denselben Protokollierungsgrad.

4

Wenn Sie sbt verwenden, um Tests auszuführen (was standardmäßig ausgeführt wird), können Sie javaOptions in der Task Test festlegen, um die verwendete Protokollierungskonfiguration zu steuern.

zB in Projekt/Build.scala:

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

Mehr über die Syntax der Test logger.xml Datei hier:

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

+1

Dies scheint nicht mehr von 2.3.2 zu funktionieren. Der obige Code wird nicht in einem Standardprojekt kompiliert. Verwaltet, um 'testOptions in Test + = Tests.Argument (" - Dlogger.file = conf/test-logger.xml ")' zu erhalten, um die Protokollierung zu konfigurieren, aber keine Protokollierung kommt aus Komponententests überhaupt. –

+0

Ich habe die Antwort bearbeitet, um play.Project zu entfernen, das in 2.3.x entfernt wurde, aber das verbleibende funktioniert immer noch - wir verwenden es derzeit in unserem Projekt. Was hast du in deiner testlogger.xml? – jazmit

+0

Das funktioniert jetzt, nachdem Sie das 'play.Project' entfernt haben. Danke für das Update @jamesinchina –