Skip to content

Instantly share code, notes, and snippets.

@beschauer
Created February 18, 2015 13:00
Show Gist options
  • Save beschauer/52e0b29cb223274ac75f to your computer and use it in GitHub Desktop.
Save beschauer/52e0b29cb223274ac75f to your computer and use it in GitHub Desktop.
First version of an access logging filter. This logs among others the request body.
object AccessLoggingFilter extends EssentialFilter with BodyParsers {
val accessLogger = Logger("access")
def apply(nextFilter: EssentialAction) = new EssentialAction {
def apply(requestHeader: RequestHeader) = {
var bodyStr = ""
// Check the body
val resultIteratee = requestHeader.contentType match {
case Some("application/json") | Some("text/plain") | Some("application/x-www-form-urlencoded") => {
// Take up to 100kb of the body
val firstPartOfBody: Iteratee[Array[Byte], Array[Byte]] =
Traversable.take[Array[Byte]](Int.MaxValue) &>> Iteratee.consume[Array[Byte]]()
firstPartOfBody.flatMap { bytes: Array[Byte] =>
// Parse the first 100kb
val parsedBody = Enumerator(bytes) |>>> parse.tolerantText(requestHeader)
Iteratee.flatten(parsedBody.map { parseResult =>
bodyStr = parseResult match {
case Right(body) => body + ""
//case _ => ""
}
Iteratee.flatten(Enumerator(bytes) |>> nextFilter(requestHeader))
})
}
}
case Some(a) =>
bodyStr = s"content-type: $a"
nextFilter(requestHeader)
case None => {
bodyStr = "no content-type"
nextFilter(requestHeader)
}
}
val startTime = System.currentTimeMillis
resultIteratee.map { result =>
val endTime = System.currentTimeMillis
val requestTime = endTime - startTime
val msg = s"method=${requestHeader.method} uri=${requestHeader.uri} " +
s" result-status=${result.header.status}" +
s" X-AUTH-TOKEN=${requestHeader.headers.get(controllers.Security.AuthTokenHeader)}" +
s" remote-address=${requestHeader.remoteAddress}" +
s" request-body='$bodyStr'" +
s" request-time ${requestTime}ms"
if(requestHeader.method == "GET") accessLogger.debug(msg)
else accessLogger.info(msg)
result
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment