簡體   English   中英

Akka-http logrequest未記錄請求正文

[英]Akka-http logrequest not logging the request body

我正在使用akka-http並嘗試使用logrequest在特定路徑上記錄請求:

 path(Segment / "account") { id =>
            logRequest("users/account", Logging.InfoLevel) {
              post {
              entity(as[Account]) { account => ???
                complete(HttpResponse(StatusCodes.NoContent))
              }
            }
          }

但是在我的日志上我看到了類似的東西

HttpRequest(HttpMethod(POST),https://localhost:9009/api/users/123/account,List(Host: localhost:9009, User-Agent: akka-http/10.0.6, Timeout-Access: <function1>),HttpEntity.Chunked(application/json),HttpProtocol(HTTP/1.1))

我正在尋找的是確切的請求,包括請求者發送的正文(json)。

日志的"HttpEntity.Chunked(application/json)"段是HttpEntity.Chunked#toString的輸出。 要獲取整個請求主體(實現為流),您需要調用HttpEntity#toStrictChunked請求實體轉換為Strict請求實體。 您可以在自定義路線中進行此調用:

def logRequestEntity(route: Route, level: LogLevel)
                    (implicit m: Materializer, ex: ExecutionContext) = {

  def requestEntityLoggingFunction(loggingAdapter: LoggingAdapter)(req: HttpRequest): Unit = {
    val timeout = 900.millis
    val bodyAsBytes: Future[ByteString] = req.entity.toStrict(timeout).map(_.data)
    val bodyAsString: Future[String] = bodyAsBytes.map(_.utf8String)
    bodyAsString.onComplete {
      case Success(body) =>
        val logMsg = s"$req\nRequest body: $body"
        loggingAdapter.log(level, logMsg)
      case Failure(t) =>
        val logMsg = s"Failed to get the body for: $req"
        loggingAdapter.error(t, logMsg)
    }
  }
  DebuggingDirectives.logRequest(LoggingMagnet(requestEntityLoggingFunction(_)))(route)
}

要使用上述內容,請將路由傳遞給它:

val loggedRoute = logRequestEntity(route, Logging.InfoLevel)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM