目的
開発中、PlayをAPIサーバーで使っていると、フロントエンド側からのリクエストがどう来ているのか確かめたくなることがあります。
ひとまずどのURLにリクエストが来たのかロギングします。
手順
「play 2.6 request log」で調べると公式ページが出てくるので、こちらをそのまま使えました。
filtersパッケージ内に以下ファイルを作成します。
package filters
import javax.inject.Inject
import akka.stream.Materializer
import play.api.Logger
import play.api.mvc._
import scala.concurrent.{ExecutionContext, Future}
class LoggingFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
def apply(nextFilter: RequestHeader => Future[Result])
(requestHeader: RequestHeader): Future[Result] = {
val startTime = System.currentTimeMillis
nextFilter(requestHeader).map { result =>
val endTime = System.currentTimeMillis
val requestTime = endTime - startTime
Logger.info(s"${requestHeader.method} ${requestHeader.uri} took ${requestTime}ms and returned ${result.header.status}")
result.withHeaders("Request-Time" -> requestTime.toString)
}
}
}
application.confに作成したLoggingFilterを使うよう設定
play.filters {
enabled += filters.LoggingFilter
}
sbt run
で再起動すると以下ログがでるようになりました!
[info] application - GET / took 1ms and returned 200
ちなみに、POSTリクエストのボディも見たいと思ったのですが、以下解答を見ますとFilterの設定ではできないようです。
Filterのapplyメソッドの引数がRequestHeaderなので、ボディ情報がとれないのもその証拠ですね。
https://stackoverflow.com/a/25492776
(※雑な意訳)
こちらによると、playframeworkはreaactive systemに則っているので、リクエストのヘッダ情報だけでフィルタは動作できるとのこと。
フィルタでリクエストのボディーまでパースして処理しようとすると遅くなるとも。