Go と Gorilla の Mux およびハンドラー パッケージを使用した HTTP 応答のログ記録
Go アプリケーションで、Gorilla の Mux およびハンドラー パッケージを利用して Web を構築するアプリケーションが HTTP 応答をログに記録しようとすると、問題が発生します。リクエストのログ記録は、Gorilla の LoggingHandler を使用して簡単に実現できますが、応答のログ記録には別のアプローチが必要です。
考えられる解決策の 1 つは、元のハンドラーをラップするカスタム ミドルウェア関数を作成することです。このミドルウェアはリクエストとレスポンスの両方を傍受でき、次のコードに示すように両方のログを記録できます:
func logResponse(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Capture the request requestBytes, err := httputil.DumpRequest(r, true) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } log.Printf("%q", requestBytes) // Create a new ResponseRecorder to capture the response rec := httptest.NewRecorder() next.ServeHTTP(rec, r) // Capture the response responseBytes := rec.Body.Bytes() log.Printf("%q", responseBytes) // Copy the recorder's headers and body into the original ResponseWriter for k, v := range rec.HeaderMap { w.Header()[k] = v } w.WriteHeader(rec.Code) w.Write(responseBytes) }) }
このミドルウェアは、ゴリラのルーターで元のハンドラーをラップすることで利用できます:
// Import Gorilla packages import ( "github.com/gorilla/mux" "github.com/gorilla/handlers" ) func main() { // Setup Gorilla router r := mux.NewRouter() // Wrap the handler with the logging middleware wrappedHandler := handlers.LoggingHandler(os.Stdout, http.HandlerFunc(handler)) // Register the handler with the router r.Handle("/api/v1/users", wrappedHandler) // Start the server http.ListenAndServe(":8080", r) }
このカスタム ミドルウェアを使用すると、HTTP リクエストとレスポンスの両方を簡単にログに記録できるため、アプリケーションの可観測性が向上し、デバッグが容易になります。パフォーマンス監視
以上がGorilla Mux とハンドラーを使用して Go Web アプリケーションで HTTP 応答をログに記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。