0Pricing
Go Academy · Leçon

Intergiciel de journalisation et d’identifiant de requête

Journalisation structurée et injection d’un identifiant de trace

Intergiciel de journalisation et d’identifiant de requête est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Pourquoi utiliser la journalisation structurée ?

Les journaux en texte brut sont difficiles à analyser à grande échelle. La journalisation structurée (JSON ou clé=valeur) permet aux agrégateurs de journaux (Datadog, Loki, ELK) de filtrer et de corréler les entrées par champ.

Génération d’un identifiant de requête

Générez un identifiant unique pour chaque requête (UUID ou ULID) dans un intergiciel, puis ajoutez-le à l’en-tête de réponse et au contexte :

func RequestID(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        id := r.Header.Get("X-Request-ID")
        if id == "" { id = uuid.New().String() }
        w.Header().Set("X-Request-ID", id)
        ctx := context.WithValue(r.Context(), reqIDKey{}, id)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

Intergiciel de journalisation avec slog

Go 1.21 a ajouté log/slog pour la journalisation structurée. Utilisez-le dans un intergiciel :

func StructuredLogger(logger *slog.Logger) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            start := time.Now()
            cw := &captureWriter{ResponseWriter: w}
            next.ServeHTTP(cw, r)
            logger.Info("request",
                "method", r.Method,
                "path", r.URL.Path,
                "status", cw.status,
                "latency_ms", time.Since(start).Milliseconds(),
                "request_id", r.Context().Value(reqIDKey{}),
            )
        })
    }
}

captureWriter

Enveloppez le ResponseWriter pour capturer le code d’état écrit par le gestionnaire :

type captureWriter struct {
    http.ResponseWriter
    status int
}
func (cw *captureWriter) WriteHeader(code int) {
    cw.status = code
    cw.ResponseWriter.WriteHeader(code)
}
func (cw *captureWriter) Status() int {
    if cw.status == 0 { return http.StatusOK }
    return cw.status
}

Ajouter l’identifiant de requête à chaque ligne de journal

Créez un journal enfant pour chaque requête, avec l’identifiant déjà renseigné, puis stockez-le dans le contexte :

reqLogger := logger.With("request_id", id)
ctx := context.WithValue(r.Context(), loggerKey{}, reqLogger)

Récupérer le journal depuis le contexte

Assistant permettant d’obtenir le journal associé à la requête depuis n’importe quel gestionnaire ou service :

func LoggerFromContext(ctx context.Context) *slog.Logger {
    l, ok := ctx.Value(loggerKey{}).(*slog.Logger)
    if !ok { return slog.Default() }
    return l
}

Niveaux de journalisation

Utilisez les niveaux appropriés : Debug pour un niveau de détail élevé en développement, Info pour les résumés de requêtes, Warn pour les anomalies récupérables et Error pour les échecs nécessitant une action. Ne journalisez pas les champs sensibles (jetons, mots de passe).

Compartiments de latence

Incluez la latence de la requête dans chaque ligne de journal. Agrégez-la dans des compartiments d’histogramme au sein de votre système de métriques (Prometheus) afin de suivre les percentiles P50, P95 et P99.

Identifiants de corrélation dans les microservices

Transmettez l’en-tête X-Request-ID des requêtes entrantes à tous les appels HTTP et gRPC sortants afin d’activer le traçage distribué sans système de traçage complet.

Échantillonnage des journaux

Pour les services à fort trafic, échantillonnez les journaux de débogage et d’information (par exemple, consignez 1 requête sur 100 au niveau de débogage) afin de réduire les coûts de stockage tout en conservant l’intégralité des journaux d’erreurs.

zap ou slog

zap (Uber) est plus rapide que slog pour les services à haut débit, mais nécessite davantage de configuration. slog fait partie de la bibliothèque standard, est portable et suffit pour la plupart des services. Préférez slog, sauf si les tests de performance révèlent un goulot d’étranglement.

Vérification rapide

Pourquoi un captureWriter est-il nécessaire dans un intergiciel de journalisation ?

Récapitulatif : journalisation et identifiant de requête

Points clés :

  • Générez ou transmettez X-Request-ID dans l’intergiciel ; stockez-le dans le contexte
  • Utilisez slog pour les journaux structurés avec des champs clé-valeur
  • captureWriter intercepte le code d’état pour la journalisation après l’exécution du gestionnaire
  • Transmettez l’identifiant de corrélation à tous les appels en aval

Questions Fréquemment Posées

La leçon « Intergiciel de journalisation et d’identifiant de requête » est-elle gratuite ?

Oui — le texte complet de « Intergiciel de journalisation et d’identifiant de requête » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Intergiciel de journalisation et d’identifiant de requête » ?

Journalisation structurée et injection d’un identifiant de trace Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Intergiciel de journalisation et d’identifiant de requête » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Fondamentaux de la chaîne d’intergiciels HTTP
  2. Intergiciel de journalisation et d’identifiant de requête
  3. Intergiciel d’authentification et de limitation du débit
  4. Intergiciel CORS et récupération après panic
← Retour à Go Academy