Skip to content

Instantly share code, notes, and snippets.

@hamnis
Last active August 29, 2015 14:06
Show Gist options
  • Save hamnis/ae8be7fc6c338fcab182 to your computer and use it in GitHub Desktop.
Save hamnis/ae8be7fc6c338fcab182 to your computer and use it in GitHub Desktop.
package unfilteredx.logging
import unfiltered.request._
import unfiltered.response._
import unfiltered.Cycle
import com.typesafe.scalalogging.Logger
import org.slf4j.LoggerFactory
object TraceLogging {
def apply[A, B](intent: Cycle.Intent[A, B])(implicit tl: TraceLogger[A, B]) =
Cycle.Intent[A, B] {
case req =>
Cycle.Intent.complete(intent)(req) ~> new ResponseFunction[Any]() {
def apply[C <: Any](resp: HttpResponse[C]) = {
tl.log(req, resp.asInstanceOf[HttpResponse[B]])
resp
}
}
}
}
trait TraceLogger[A, B] {
def log(request: HttpRequest[A], response: HttpResponse[B]): Unit
}
object TraceLogger {
import unfiltered.netty.ReceivedMessage
import io.netty.handler.codec.http.{HttpResponse => NettyHttpResponse, DefaultFullHttpResponse, DefaultFullHttpRequest}
import scala.collection.JavaConverters._
import java.util.UUID
import java.nio.charset.StandardCharsets.UTF_8
implicit object NettyTraceLogger extends TraceLogger[ReceivedMessage, NettyHttpResponse] {
private val logger = Logger(LoggerFactory.getLogger("request-response"))
def log(request: HttpRequest[ReceivedMessage], response: HttpResponse[NettyHttpResponse]): Unit = {
val uuid = UUID.randomUUID().toString
val baseRequestString = s"$uuid ${request.method} ${request.uri}"
val requestString = request.underlying.request match {
case req: DefaultFullHttpRequest => s"$baseRequestString Content=[${req.content().toString(UTF_8)}]"
case _ => baseRequestString
}
logger.debug(requestString)
val baseResponseString = s"$uuid ${response.underlying.getStatus.code()} Headers=[${
response.underlying.headers().entries().asScala.mkString
}]"
val logString = response.underlying match {
case resp: DefaultFullHttpResponse => s"$baseResponseString Content=[${resp.content().toString(UTF_8)}]"
case _ => baseResponseString
}
logger.debug(logString)
()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment