Maison  >  Article  >  développement back-end  >  Comment enregistrer efficacement les données de requête et de réponse HTTP dans les API Go ?

Comment enregistrer efficacement les données de requête et de réponse HTTP dans les API Go ?

DDD
DDDoriginal
2024-11-06 01:48:02725parcourir

How to Effectively Log HTTP Request and Response Data in Go APIs?

Consignation des données de requête et de réponse HTTP

Lors du développement d'API Web dans Go, la journalisation de la requête HTTP entrante et de la réponse HTTP sortante est cruciale pour la surveillance et le débogage. Cependant, l'interface http.ResponseWriter par défaut ne fournit pas un moyen pratique de capturer les données de réponse une fois qu'elles ont été écrites.

Capture des données de réponse à l'aide de io.MultiWriter

Une solution consiste à utiliser la fonction io.MultiWriter pour créer un rédacteur qui duplique ses écritures vers plusieurs destinations. Cela vous permet d'enregistrer la réponse tout en l'envoyant au client.

<code class="go">func api1(w http.ResponseWriter, req *http.Request) {
    var log bytes.Buffer
    rsp := io.MultiWriter(w, &log)

    // Subsequent writes to rsp will be duplicated to both w and log
    ...
}</code>

Capture des données de requête à l'aide de io.TeeReader

Pour capturer le corps de la requête HTTP entrante pour la journalisation, vous pouvez utiliser la fonction io.TeeReader pour créer un lecteur qui lit le corps de la requête d'origine tout en écrivant également dans un tampon séparé.

<code class="go">func api1(w http.ResponseWriter, req *http.Request) {
    var log bytes.Buffer
    tee := io.TeeReader(req.Body, &log)
    err := json.NewDecoder(tee).Decode(&requestData)
    ...
}</code>

Combinaison des données de requête et de réponse pour la journalisation

Avec les données de requête et de réponse capturées dans leurs tampons respectifs, vous pouvez désormais les combiner en un seul message de journal.

<code class="go">// Assuming we have set up log to be a logger with desired format and output
log.Printf("%s %s %d %s %s", req.Method, req.URL.Path, req.Proto, log.BufioReader, log.Bytes())</code>

En combinant ces techniques, vous pouvez capturer efficacement et enregistrez à la fois les données de requête HTTP entrante et de réponse HTTP sortante, fournissant ainsi des informations précieuses pour le dépannage et la surveillance de votre API.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn