Go を使用した HTTP 応答のログ記録
Go でのリクエストのログ記録は、Gorilla の mux やハンドラーなどのパッケージを使用すると簡単です。ただし、応答のログ記録はさらに難しい場合があります。この記事では、これを実現する方法について説明します。
カスタム ログ ハンドラーの使用
解決策の 1 つは、HTTP ハンドラー関数をラップするカスタム ログ ハンドラーを作成することです。以下の Eric Broda のコードは、初期フレームワークを提供します。
func logHandler(fn http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { x, err := httputil.DumpRequest(r, true) if err != nil { http.Error(w, fmt.Sprint(err), http.StatusInternalServerError) return } log.Println(fmt.Sprintf("%q", x)) } }
レスポンスの変更
実際にクライアントにレスポンスを送信するには、コードを変更する必要があります。
func logHandler(fn http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { x, err := httputil.DumpRequest(r, true) if err != nil { http.Error(w, fmt.Sprint(err), http.StatusInternalServerError) return } log.Println(fmt.Sprintf("%q", x)) rec := httptest.NewRecorder() fn(rec, r) log.Println(fmt.Sprintf("%q", rec.Body)) // this copies the recorded response to the response writer for k, v := range rec.HeaderMap { w.Header()[k] = v } w.WriteHeader(rec.Code) rec.Body.WriteTo(w) } }
この変更されたコードはハンドラー関数をラップし、リクエストとレスポンス本文の両方をログに記録します。このログ ハンドラーをミドルウェア スタックに配置すると、アプリケーション全体で応答を簡単にログに記録できます。
以上がGo で HTTP レスポンスを効果的に記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。