Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Log Cekap Kedua-dua Permintaan HTTP dan Respons dalam Go?

Bagaimanakah Saya Boleh Log Cekap Kedua-dua Permintaan HTTP dan Respons dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-04 00:09:10654semak imbas

How Can I Efficiently Log Both HTTP Requests and Responses in Go?

Melog Permintaan dan Respons dalam Go

Apabila mencipta aplikasi yang kompleks dalam Go, pengendalian permintaan dan respons HTTP dengan cekap adalah penting. Walaupun pakej mux dan handler kit web Gorilla memudahkan pengendalian permintaan, respons pengelogan kekal sebagai cabaran.

Untuk menangani perkara ini, jawapan yang diterima oleh Eric Broda menawarkan penyelesaian yang menangkap butiran permintaan. Walau bagaimanapun, ia gagal untuk log respons sebenar yang dihantar kepada pelanggan. Untuk menyelesaikan masalah ini, pengubahsuaian pada kod diperlukan:

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

Kod yang diubah suai ini memintas respons dan menyalinnya kepada penulis respons, membolehkan pengelogan kedua-dua permintaan dan respons.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Log Cekap Kedua-dua Permintaan HTTP dan Respons dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn