「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > http.ResponseWriter を変更せずに HTTP 応答をログに記録する方法

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

2024 年 11 月 9 日に公開
ブラウズ:152

How to Log HTTP Responses Without Modifying http.ResponseWriter?

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

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

ミドルウェア チェーン

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

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

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)
    }
}

ソリューションの適用

特定のカテゴリのすべてのハンドラーの自動応答ロギングを確実にするために、ロギング ミドルウェアをカプセル化する別のハンドラー コンビネータを作成します:

func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc {
    return NewResponseLoggingHandler(NewOtherStuffHandler(next))
}

これで、NewDefaultHandler を使用してインスタンス化されたハンドラー チェーンには、応答ログやその他のデフォルトの動作が自動的に含まれるようになります。

h := NewDefaultHandler(...)

結論

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3