Created
February 18, 2015 13:00
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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