ホームページ >バックエンド開発 >Golang >http.ResponseWriter を変更せずに HTTP 応答をログに記録する方法

http.ResponseWriter を変更せずに HTTP 応答をログに記録する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 23:19:29591ブラウズ

How to Log HTTP Responses Without Modifying http.ResponseWriter?

http.HandleFunc での HTTP 応答のログ記録

この記事では、リクエストの偽装や http.ResponseWriter の変更に頼らずに、ログ記録の目的で HTTP 応答を取得する別のアプローチについて説明します。ミドルウェア チェーンの概念を導入し、関数型スタイルの実装を提供します。

ミドルウェア チェーン

ミドルウェア チェーンには、メイン リクエストの実行の前後に特定のタスクを実行するハンドラーのチェーンに制御を渡すことが含まれます。ミドルウェアとして知られるこれらのハンドラーは、リクエストとチェーン内の次のハンドラーを受け取り、順序付けられた実行を保証します。

HTTP ハンドラー コンビネーターとして機能するカスタム ミドルウェア関数を定義します。

<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Replace the response writer with a recorder for subsequent handlers
        c := httptest.NewRecorder()
        next(c, r)

        // Copy data from the recorder to the original response writer
        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>

次に、次を使用してインスタンス化されたハンドラー チェーンを作成します。 NewDefaultHandler には、応答ログとその他のデフォルト動作が自動的に組み込まれます。

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

結論

ミドルウェア チェーンを使用すると、リクエストの偽装や http の変更を必要とせずに、HTTP 応答を透過的に傍受してログに記録できます。レスポンスライター。このアプローチにより、モジュラーロギングが可能になり、ハンドラー管理が簡素化されます。

以上がhttp.ResponseWriter を変更せずに HTTP 応答をログに記録する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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