LoginSignup
2
0

More than 5 years have passed since last update.

play 2.6でaccess Logを出力

Posted at

目的

開発中、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に則っているので、リクエストのヘッダ情報だけでフィルタは動作できるとのこと。
フィルタでリクエストのボディーまでパースして処理しようとすると遅くなるとも。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0