Play! 2.5 log access to stdout in development

826 views Asked by At

Is there easy way to get development access logs on my console with Play 2.5? Something I could read as "GET /foo/123 routed to FooController's show action with id=123"?

I've found how to get netty access log ( btw, option play.server.netty.log.wire=true in application.conf doesn't work for me for some reason, but -Dplay.server.netty.log.wire=true does ), but it's too low-level.

1

There are 1 answers

2
Jean On BEST ANSWER

You can create a logger.xml file in the conf directory. It should follow logback's file format.

for instance a default configuration could look like :

<configuration scan="true" scanPeriod="5 seconds">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%level %logger{15} - %message%n%xException{5}</pattern>
        </encoder>
    </appender>

    <logger name="play" level="INFO" />
    <logger name="application" level="INFO" />

    <root level="ERROR">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

You can then enable loglevels : FATAL, ERROR, WARNING, INFO, DEBUG, TRACE selectively for any package or as a default on the root leve.

This is described in the playframework configuration configuring logging

Note that this behaviour was changed in 2.4.x from the previous versions where you could configure loggers through application.conf

Once you have logging working you can use the sample logging filter provided in the documentation to log all requests to your server.

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

you will have to activate it by setting the play.http.filters:

play.http.filters=com.example.LoggingFilter