玩! 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
有没有简单的方法可以在我的 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