7
votes

Connectez-vous toutes les demandes en jeu 2

Comment puis-je enregistrer toutes les demandes entrant dans une application de lecture 2, de la même manière que les journaux Apache (I.E. y compris l'URL et la propriété intellectuelle client)?


2 commentaires

Ce type de journal est appelé journal d'accès . Et si la lecture n'a pas de plugin de journal d'accès, je vous suggérerais de le déplacer avec un serveur Web qui fait.


Malheureusement, je n'ai pas d'accès root pour installer ou configurer Apache, et j'ai juste besoin d'une solution rapide maintenant.


4 Réponses :


7
votes

C'est ce que font les filtres HTTP. Voici quelques exemples détaillés: http://www.playframework.com/documentation/2.1.1/scalahttpfilters


0 commentaires

-1
votes

Créer votre propre action est beaucoup plus puissante et flexible. xxx pré>

Pour l'utiliser dans le contrôleur, remplacez simplement l'action avec MyACTION P>

def index = MyAction {
  implicit request =>
     // nothing to be changed here
}


1 commentaires

... aussi bien que plus invasif



10
votes

Je voulais faire la même chose avec Jeu 2.5.4. Il m'a fallu un peu de temps pour mettre les morceaux ensemble, alors je pensais que je partagerais mes pas dans l'espoir que cela permettra de gagner du temps à quelqu'un d'autre:

  1. Assurez-vous de disposer d'un enregistreur d'accès. Il y a un exemple de la configuration de l'une à https://www.playframework.com/documentation/ 2.5.x / ParamètresLogger Mais vous voudrez peut-être jouer avec les paramètres; J'ai mis en configuré mon enregistreur avec $ {application.home: -.} / Journaux / access.log fichier> code> et code>. p> li>

  2. Créez une nouvelle requesthandler dans votre package racine, prolongeant le gestionnaire par défaut: p> li> ol>

    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)
      }
    }
    


0 commentaires

2
votes

dans la lecture 2.5.x, j'ai utilisé le suivant

import javax.inject.Inject
import akka.stream.Materializer
import play.api.Logger
import play.api.mvc._
import scala.concurrent.{ExecutionContext, Future}
import java.util.Calendar
import java.text.SimpleDateFormat

class ApacheLoggingFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {

  def apply(nextFilter: RequestHeader => Future[Result])
           (requestHeader: RequestHeader): Future[Result] = {

    nextFilter(requestHeader).map { result =>

      val responseSize =  result.body.contentLength.getOrElse("-")
      Logger("access").info(s"""${requestHeader.remoteAddress} - - [${serverTime}] "${requestHeader}" ${result.header.status} ${responseSize}""")
      result
    }
  }

  private def serverTime = {
    val calendar = Calendar.getInstance()
    val dateFormat = new SimpleDateFormat(
      "dd/MMM/yyyy:HH:mm:ss Z")
    dateFormat.setTimeZone(calendar.getTimeZone)
    dateFormat.format(calendar.getTime())
  }
}


0 commentaires