I am using Akka-Http to make a rest server and i want to log requests and results, however I'm getting an exception whenever i try to do runReduce
on the response entity. The exception says java.lang.NullPointerException: Deflater has been closed
. The exception does not prevent me from logging the body, but i only get gibberish in the log: ��]D�O!�c�?�%{�GY\��>������t
. Can someone explain why this is happening? I suspect its because the stream that stores the response-body is closed or not opened but i don't know how to solve it.
The set-up for logging is shown below. The logging happens in the logResponse
-method inside RequestResponseLogWriter
. I use akkas own directives for getting the request and response entities. Logging is done with slf4j.
trait RouteBuilder extends Directives {
val logWriter = new RequestResponseLogWriter()
val routes: Route =
extractRequestContext { context =>
logRequestResult(LoggingMagnet(_ => logWriter.responseLogging(context))) {
ComponentRegistry.searchRestApi.routes
}
}
}
class RequestResponseLogWriter extends LazyLogging {
val responseLogging = (context: RequestContext) => (request: HttpRequest) =>
(result: RouteResult) =>
result match {
case RouteResult.Complete(response) => logResponse(context, request, response)
case RouteResult.Rejected(_) =>
}
private def logResponse(context: RequestContext, request: HttpRequest,
response: HttpResponse): Unit = {
implicit val ec: ExecutionContext = context.executionContext
implicit val mat: Materializer = context.materializer
response.entity.dataBytes.runReduce(_ ++ _)
.foreach(bytes => logger.info(s"Body ${bytes.utf8String}"))
}
}