Consignation des réponses HTTP à l'aide de Go
La journalisation des requêtes dans Go est simple avec des packages comme le multiplexeur et le gestionnaire de Gorilla. Cependant, la journalisation des réponses peut être plus délicate. Cet article explique comment y parvenir.
Utilisation d'un gestionnaire de journalisation personnalisé
Une solution consiste à créer un gestionnaire de journalisation personnalisé qui encapsule une fonction de gestionnaire HTTP. Le code d'Eric Broda ci-dessous fournit un premier cadre :
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)) } }
Modifier la réponse
Pour envoyer réellement la réponse au client, une modification du code est nécessaire :
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) } }
Ce code modifié enveloppe la fonction de gestionnaire et enregistre à la fois la requête et le corps de la réponse. En plaçant ce gestionnaire de journalisation dans la pile middleware, vous pouvez facilement enregistrer les réponses dans toute votre application.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!