app/logging/LogEntry.scala (41 lines of code) (raw):
package logging
import play.api.http.HeaderNames.*
import play.api.mvc.{RequestHeader, Result}
import utils.RequestHelper.origin
case class LogEntry(message: String, otherFields: Map[String, Any])
private[logging] object LogEntry {
private def commonFields(request: RequestHeader, duration: Long) =
Map(
"type" -> "access",
"origin" -> origin(request),
"referrer" -> request.headers.get(REFERER).getOrElse(""),
"method" -> request.method,
"duration" -> duration,
"protocol" -> request.version,
"requested_uri" -> request.uri,
)
def requestAndResponse(request: RequestHeader, response: Result, duration: Long): LogEntry = {
val fields = commonFields(request, duration) ++ Map(
"status" -> response.header.status,
"content_length" -> response.header.headers.get(CONTENT_LENGTH).map(_.toInt).getOrElse(0),
)
val message =
s"""${fields("origin")} -
|"${request.method} ${request.uri} ${request.version}"
|${response.header.status}
|${fields("content_length")}
|"${fields("referrer")}"
|${duration}ms""".stripMargin.replaceAll("\n", " ")
LogEntry(message, fields)
}
def error(request: RequestHeader, duration: Long): LogEntry = {
val fields = commonFields(request, duration)
val message =
s"""${fields("origin")} -
|"${request.method} ${request.uri} ${request.version}"
|ERROR
|"${fields("referrer")}"
|${duration}ms""".stripMargin.replaceAll("\n", " ")
LogEntry(message, fields)
}
}