ホームページ >バックエンド開発 >Golang >`http.HandleFunc` とミドルウェアを使用してリアルタイム HTTP 応答をログに記録するにはどうすればよいですか?

`http.HandleFunc` とミドルウェアを使用してリアルタイム HTTP 応答をログに記録するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-27 10:29:03361ブラウズ

How to Log Real-Time HTTP Responses with `http.HandleFunc` and Middleware?

http.HandleFunc を使用した受信 HTTP リクエストのログ記録

前の説明では、単体テストに適した手法である偽のリクエストを使用した HTTP 応答の検査について説明しました。ただし、リアルタイムの応答データをライブ サーバーに記録する方法も模索しています。

ミドルウェア チェーン

一般的なアプローチには、ミドルウェア チェーンの作成が含まれます。 Negroni などのライブラリは、ハンドラーを組み合わせて順番に実行するミドルウェア機能を提供します。最小限のミドルウェア実装は、ハンドラー コンビネータを使用して実現できます:

<code class="go">func NewFooHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Do pre-handling tasks
        next(w, r)
        // Do post-handling tasks
    }
}</code>

これらのコンビネータをチェーンしてハンドラを形成できます:

<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>

HTTP.HandleFunc に適用

この手法を問題に適用するには、ハンドラー コンビネータを作成します:

<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Record the response
        c := httptest.NewRecorder()
        next(c, r)
        
        // Copy responses
        for k, v := range c.HeaderMap {
            w.Header()[k] = v
        }
        w.WriteHeader(c.Code)
        c.Body.WriteTo(w)
    }
}</code>

次に、カスタム ハンドラーと応答ログを組み合わせるデフォルト ハンドラーを作成できます:

<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc {
    return NewResponseLoggingHandler(NewOtherStuffHandler(next))
}</code>

このデフォルトのハンドラーを使用すると、

<code class="go">h := NewDefaultHandler(...)</code>

後続のすべてのハンドラーには、自動的に応答ログが含まれます。

以上が`http.HandleFunc` とミドルウェアを使用してリアルタイム HTTP 応答をログに記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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