2016-07-21 23 views
2

ジムのミドルウェアにレスポンスボディを記録する必要がありますが、レスポンスボディを取得する方法が見つかりません。誰も助けることができますか?応答ボディをジンでログに記録する方法

は、私はこのようなミドルウェアを使用しています:

func Logger() gin.HandlerFunc { 

    return func(c *gin.Context) { 

     c.Next() 

     statusCode := c.Writer.Status() 
     if statusCode >= 400 { 
      //ok this is an request with error, let's make a record for it 
      //log body here 
     } 
    } 
} 

私の質問は、どのようにミドルウェア文脈からレスポンスボディを取得するには?

+0

ない既に場合は、ここで言及したエラー処理を確認してくださいhttps://github.com/gin-gonic/gin/issues/274 – Aravind

+0

うーん、私は私はあなたのポイントを得ると思いますコンテキストにエラーを追加し、ミドルウェアで処理する必要があります。しかし、ミドルウェアのレスポンス・ボディを取得する方法についてはまだ興味があります。クライアントに送り返す前に、何か身体で何かをする必要があるのでしょうか?それとも、奇妙な要件は、私は応答のボディを取得する必要がありますか? –

答えて

4

レスポンスの書き込みを横取りして、どこかに格納する必要があります。それからあなたはそれを記録することができます。そのためには、独自のWriterを実装してWrite()呼び出しを実装する必要があります。例えば

、次のように:

type bodyLogWriter struct { 
    gin.ResponseWriter 
    body *bytes.Buffer 
} 

func (w bodyLogWriter) Write(b []byte) (int, error) { 
    w.body.Write(b) 
    return w.ResponseWriter.Write(b) 
} 

func ginBodyLogMiddleware(c *gin.Context) { 
    blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer} 
    c.Writer = blw 
    c.Next() 
    statusCode := c.Writer.Status() 
    if statusCode >= 400 { 
     //ok this is an request with error, let's make a record for it 
     // now print body (or log in your preferred way) 
     fmt.Println("Response body: " + blw.body.String()) 
    } 
} 

を次に、このように、このミドルウェアを使用:この敷居がジンと静的ファイルのために動作しないことに

router.Use(ginBodyLogFilter) 

注は、cを使用していないようです.Writer forそれら。しかし、ほとんどの場合、それはあなたがとにかく欲しいものです。

すべてのファイルをインターセプトする場合は、やや複雑なアプローチを使用する必要があります。ミドルウェアの代わりに、gin.Engineをラップするラッパーhttp.Handlerを実装する必要があります。上記のような同じアプローチを使用して、http.ResponseWriterに書き込まれたものを傍受してログに記録します。そして、このようジン・サーバを実行します。

ginRouter := gin.New() 
// configure your middleware and routes as required 

// Run http server as follows, where bodyLogHandler is your wrapper handler 
http.ListenAndServe(bindAddress, &bodyLogHandler{wrappedHandler: ginRouter} 
+0

ありがとう、私はそれを得る、作家は書くことができるので、私はそれを直接読むことができません。 Thnaks。 –

+0

ありがとう、私はどのように私はポストパラメータも取得知っている? –

+0

ミドルウェアのアプローチを使用している場合は、実際のハンドラでリクエストを処理するときと同じ方法で、gin.ContextからginBodyLogMiddlewareを取得します。 bodyLogWriterのWrite関数内のレスポンスライターからは取得できませんが、bodyLogWriter構造体には常にgin.Contextを追加できます。それは、とにかく各リクエストに対してインスタンス化されます。 – Seva

関連する問題