我正在使用Akka-Http来创建备用服务器,并且我想记录请求和结果,但是,每当我尝试对响应实体执行runReduce
时,我都会遇到异常。异常为java.lang.NullPointerException: Deflater has been closed
。异常不会阻止我记录身体,但是我只会在日志中��]D�O!�c�?�%{�GY\��>������t
出现乱码。有人可以解释为什么会这样吗?我怀疑是因为存储响应主体的流是关闭还是未打开,但是我不知道如何解决。
用于记录的设置如下所示。记录发生在logResponse
内部的RequestResponseLogWriter
方法中。我使用akkas自己的指令来获取请求和响应实体。记录是使用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}"))
}
}