Comment puis-je enregistrer toutes les demandes em> 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)? P>
4 Réponses :
C'est ce que font les filtres HTTP. Voici quelques exemples détaillés: http://www.playframework.com/documentation/2.1.1/scalahttpfilters p>
Créer votre propre action est beaucoup plus puissante et flexible. Pour l'utiliser dans le contrôleur, remplacez simplement l'action avec MyACTION P> def index = MyAction {
implicit request =>
// nothing to be changed here
}
... aussi bien que plus invasif
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:
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 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)
}
}
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()) } }
Ce type de journal est appelé journal d'accès i>. 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.