ホームページ >バックエンド開発 >Golang >Go で HTTP レスポンスを効果的に記録するにはどうすればよいですか?

Go で HTTP レスポンスを効果的に記録するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-28 11:08:11291ブラウズ

How Can I Effectively Log HTTP Responses in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。