デフォルトLogger
では、アプリケーションの実行時に表示されるすべての出力は、アプリケーションのテスト時にミュートになります。
デバッグや情報などをspecs2
レポートに強制的に表示するにはどうすればよいですか?
デフォルトLogger
では、アプリケーションの実行時に表示されるすべての出力は、アプリケーションのテスト時にミュートになります。
デバッグや情報などをspecs2
レポートに強制的に表示するにはどうすればよいですか?
まず、テストモードでロギングが無効になっている背景が気に入るかもしれません。これは、プレイフォーラムの質問に対する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"
FakeApplicationを使用している場合は、いくつかの構成情報を渡すことができます。
FakeApplication(additionalConfiguration = Map(
"logger.application" -> "DEBUG"
))
これにより、LOGGERの出力がデバッグ以上の出力に制限されます。
設定が「ベタベタ」しているのを見てびっくりしました。初期のテストでFakeApplicationを使用する場合、FakeApplicationを使用しない後のテストでも同じログレベルが使用されます。
次のような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
出来上がり!テストにデータを記録します。これはメモリリークにつながりますが、開発中に非常に貴重です。
sbtを使用してテストを実行している場合(デフォルトではplayが実行します)、テストタスクでjavaOptionsを設定して、使用されるログ構成を制御できます。
例:project / Build.scala:
javaOptions in Test += "-Dlogger.file=conf/test-logger.xml"
test-logger.xmlファイルの構文について詳しくは、こちらをご覧ください。
Play Loggerソースを見ると、テストモードでログが無効になっていることがわかります。
本当にログが必要な場合は、テスト用のログ構成ファイルを作成し、システムプロパティ「logger.file」としてPlayに渡すことができます。
ロギング構成の例(プロジェクトルートのtest-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