Posted at

play 2.6でaccess Logを出力


目的

開発中、PlayをAPIサーバーで使っていると、フロントエンド側からのリクエストがどう来ているのか確かめたくなることがあります。

ひとまずどのURLにリクエストが来たのかロギングします。


手順

「play 2.6 request log」で調べると公式ページが出てくるので、こちらをそのまま使えました。

filtersパッケージ内に以下ファイルを作成します。


LoggingFilter.scala

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に則っているので、リクエストのヘッダ情報だけでフィルタは動作できるとのこと。

フィルタでリクエストのボディーまでパースして処理しようとすると遅くなるとも。