From a9653baf6113ea4e15fe61e283e5af47e2e4e0cf Mon Sep 17 00:00:00 2001 From: vlad Date: Tue, 14 Mar 2017 00:37:41 -0700 Subject: Added writing tracking Id to MDC so it can be logged for all messages, removed some linkerd legacy and refined Revision equals --- src/main/scala/xyz/driver/core/app.scala | 33 ++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'src/main/scala/xyz/driver/core/app.scala') diff --git a/src/main/scala/xyz/driver/core/app.scala b/src/main/scala/xyz/driver/core/app.scala index c90a128..9884dff 100644 --- a/src/main/scala/xyz/driver/core/app.scala +++ b/src/main/scala/xyz/driver/core/app.scala @@ -3,15 +3,19 @@ package xyz.driver.core import java.sql.SQLException import akka.actor.ActorSystem +import akka.event.Logging.LogLevel +import akka.event.{Logging, LoggingAdapter} import akka.http.scaladsl.Http import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.model.headers.RawHeader -import akka.http.scaladsl.model.{HttpResponse, StatusCodes} +import akka.http.scaladsl.model.{HttpEntity, HttpRequest, HttpResponse, StatusCodes} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.RouteResult._ +import akka.http.scaladsl.server.directives.{LogEntry, LoggingMagnet} import akka.http.scaladsl.server.{ExceptionHandler, Route, RouteConcatenation} -import akka.stream.ActorMaterializer +import akka.stream.scaladsl.Sink +import akka.stream.{ActorMaterializer, Materializer} import com.typesafe.config.Config import io.swagger.models.Scheme import org.slf4j.{LoggerFactory, MDC} @@ -76,13 +80,30 @@ object app { val contextWithTrackingId = ctx.withRequest(ctx.request.addHeader(RawHeader(ContextHeaders.TrackingIdHeader, trackingId))) - handleExceptions(ExceptionHandler(exceptionHandler))({ _ => - respondWithHeaders(List(RawHeader(ContextHeaders.TrackingIdHeader, trackingId))) { - modules.map(_.route).foldLeft(versionRt ~ healthRoute ~ swaggerRoutes)(_ ~ _) - }(contextWithTrackingId) + handleExceptions(ExceptionHandler(exceptionHandler))({ c => + logRequestResult(LoggingMagnet(log => myLoggingFunction(Logging.InfoLevel, log))) { + respondWithHeaders(List(RawHeader(ContextHeaders.TrackingIdHeader, trackingId))) { + modules.map(_.route).foldLeft(versionRt ~ healthRoute ~ swaggerRoutes)(_ ~ _) + } + }(c) })(contextWithTrackingId) }), interface, port)(materializer) } + + def myLoggingFunction(level: LogLevel, logger: LoggingAdapter)(req: HttpRequest)(res: Any): Unit = { + val entry = res match { + case Complete(resp) => + entityAsString(resp.entity).map { data => + LogEntry(s"${req.method} ${req.uri}: ${resp.status} \n entity: $data", level) + } + case other => + Future.successful(LogEntry(s"$other", level)) + } + entry.map(_.logTo(logger)) + } + + def entityAsString(entity: HttpEntity)(implicit m: Materializer, ex: ExecutionContext): Future[String] = + entity.dataBytes.map(_.decodeString(entity.contentType.charsetOption.map(_.value).get)).runWith(Sink.head) } /** -- cgit v1.2.3