首页 > 解决方案 > 使用 akka-http 记录响应正文时出现错误“Deflater 已关闭”

问题描述

我正在使用 Akka-Http 制作一个休息服务器,我想记录请求和结果,但是每当我尝试runReduce在响应实体上执行时,我都会遇到异常。异常说java.lang.NullPointerException: Deflater has been closed。该异常不会阻止我记录正文,但我只会在日志中出现乱码:��]D�O!�c�?�%{�GY\��>������t。有人可以解释为什么会这样吗?我怀疑是因为存储响应体的流已关闭或未打开,但我不知道如何解决。

记录的设置如下所示。日志记录发生在logResponse-method inside 中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}"))
  }
}

标签: scalaakka-http

解决方案


推荐阅读