玩! 2.5 开发中对stdout的日志访问

Play! 2.5 log access to stdout in development

有没有简单的方法可以在我的 Play 2.5 主机上获取开发访问日志? 我可以读作 "GET /foo/123 routed to FooController's show action with id=123"?

我找到了如何获取 netty 访问日志(顺便说一句,application.conf 中的选项 play.server.netty.log.wire=true 出于某种原因对我不起作用,但是 -Dplay.server.netty.log.wire =true 确实 ), 但它太低级了。

您可以在 conf 目录中创建一个 logger.xml 文件。它应该遵循 logback 的文件格式。

例如,默认配置可能如下所示:

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

然后您可以为任何包选择性地启用日志级别:FATAL、ERROR、WARNING、INFO、DEBUG、TRACE 或作为根级别的默认值。

这在 playframework 配置中有描述 configuring logging

请注意,此行为是 changed in 2.4.x 来自以前的版本,您可以通过 application.conf

配置记录器

一旦您的日志记录正常工作,您就可以使用示例日志记录过滤器 provided in the documentation 将所有请求记录到您的服务器。

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

您必须通过设置 play.http.filters:

来激活它
play.http.filters=com.example.LoggingFilter