2017-08-02 9 views
0

をロギングない:アッカ-HTTP logrequest Iはアッカ-HTTPを使用して<a href="http://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/directives/debugging-directives/logRequest.html" rel="nofollow noreferrer">logrequest</a>を使用して、特定のパス上の要求をログに記録しようとしていますリクエストボディ

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)を含む正確なリクエストです。

答えて

2

ログの"HttpEntity.Chunked(application/json)"セグメントは、出力がHttpEntity.Chunked#toStringです。ストリームとして実装されているリクエスト本体全体を取得するには、ChunkedリクエストエンティティをStrictリクエストエンティティに変換するためにHttpEntity#toStrictを呼び出す必要があります。 、上記を使用するには

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) 
関連する問題