レスポンスの書き込みを横取りして、どこかに格納する必要があります。それからあなたはそれを記録することができます。そのためには、独自の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}
ない既に場合は、ここで言及したエラー処理を確認してくださいhttps://github.com/gin-gonic/gin/issues/274 – Aravind
うーん、私は私はあなたのポイントを得ると思いますコンテキストにエラーを追加し、ミドルウェアで処理する必要があります。しかし、ミドルウェアのレスポンス・ボディを取得する方法についてはまだ興味があります。クライアントに送り返す前に、何か身体で何かをする必要があるのでしょうか?それとも、奇妙な要件は、私は応答のボディを取得する必要がありますか? –