7

Play 2 アプリケーションに着信するすべてのリクエストを、Apache がログに記録するのと同様の方法で (つまり、URL とクライアント IP を含めて) ログに記録するにはどうすればよいですか?

4

4 に答える 4

10

Play 2.5.4 でも同じことをしたかったのです。ピースをまとめるのに少し時間がかかったので、他の誰かのために時間を節約できることを願って、私の手順を共有したいと思いました:

  1. アクセスロガーがあることを確認してください。https://www.playframework.com/documentation/2.5.x/SettingsLoggerに設定方法の例があり ますが、設定を試してみたい場合があります。<file>${application.home:-.}/logs/access.log</file>、およびで ロガーを構成し<immediateFlush>true</immediateFlush>ました。

  2. デフォルトのハンドラーを拡張して、ルート パッケージに新しい RequestHandler を作成します。

import javax.inject.Inject
import play.api.http._
import play.api.routing._
import play.api.mvc.RequestHeader
import play.api.Logger

/**
 * Implemented to get custom, apache-style logging of requests without dumping the full netty wire.
 */
class RequestHandler @Inject() (router: Router, errorHandler: HttpErrorHandler,
                                configuration: HttpConfiguration, filters: HttpFilters) extends DefaultHttpRequestHandler(
  router, errorHandler, configuration, filters) {

  override def routeRequest(request: RequestHeader) = {
    Logger("access").info(s"Request from ${request.remoteAddress}: ${request}")
    super.routeRequest(request)
  }
}

私は Play 2.3 から来たので、このガイドを見つけるまでは、もともと GlobalSettings を使用する予定でした: https://www.playframework.com/documentation/2.5.x/GlobalSettings

Play 2.0 に固有の回答を求めている人には申し訳ありませんが、私自身の 2.5 に焦点を当てた検索でここにたどり着いたので、この回答はそれほど害を及ぼさないと考えています。

于 2016-07-28T17:33:33.957 に答える
7

それがhttpフィルターの目的です。詳細な例を次に示します: http://www.playframework.com/documentation/2.1.1/ScalaHttpFilters

于 2013-05-24T11:50:45.113 に答える
-1

独自のアクションを作成すると、はるかに強力で柔軟になります。

object MyAction {
  def apply[A](bodyParser: BodyParser[A])(block: Request[A] => Result): Action[A] = Action(bodyParser) {
    request =>
      // TODO : authentication, cache logics here         

      // time it 
      val start = ...
      // process
      val r = block(request)
      val end = ...

      // log remote address, user agent, time, etc.

      r
  }

  // simply override to use MyAction
  def apply(block: Request[AnyContent] => Result): Action[AnyContent] = this.apply(BodyParsers.parse.anyContent)(block)

  // simply override to use MyAction
  def apply(block: => Result): Action[AnyContent] = this.apply(_ => block)
}

コントローラーで使用するには、Action を MyAction に置き換えるだけです。

def index = MyAction {
  implicit request =>
     // nothing to be changed here
}
于 2013-05-24T12:55:08.897 に答える