slog.Logger.WithGroup în Go

Returnează un logger nou care pune toate atributele următoare într-un grup cu numele dat.

Sintaxă
func (l *Logger) WithGroup(name string) *Logger

Ce face slog.Logger.WithGroup

După l2 := logger.WithGroup("plata"), atributele date lui l2 (în apeluri sau prin With) apar sub grupul plata: plata.suma=... în text, "plata":{...} în JSON. Atributele adăugate înainte de WithGroup și câmpurile standard (level, msg) rămân în afara grupului.

Este util când dai un logger unei biblioteci sau componente: tot ce scrie ea ajunge într-un spațiu de nume propriu și nu se ciocnește cu restul.

Parametri

Parametru Descriere
name Numele grupului.

Ce returnează

Un *slog.Logger nou.

Exemple

Exemplul 1: Atributele unei componente într-un grup

package main

import (
    "log/slog"
    "os"
)

func faraTimp(groups []string, a slog.Attr) slog.Attr {
    if a.Key == slog.TimeKey && len(groups) == 0 {
        return slog.Attr{} // un atribut gol nu este afișat
    }
    return a
}

func main() {
    opt := &slog.HandlerOptions{ReplaceAttr: faraTimp}
    for _, h := range []slog.Handler{slog.NewTextHandler(os.Stdout, opt), slog.NewJSONHandler(os.Stdout, opt)} {
        logger := slog.New(h).With("cerere", "req-81c2")
        plata := logger.WithGroup("plata")
        plata.Info("plată autorizată", "suma", 249.9, "moneda", "RON")
    }
}

Rezultat

level=INFO msg="plată autorizată" cerere=req-81c2 plata.suma=249.9 plata.moneda=RON
{"level":"INFO","msg":"plată autorizată","cerere":"req-81c2","plata":{"suma":249.9,"moneda":"RON"}}

Exemplul 2: Grupuri imbricate

package main

import (
    "log/slog"
    "os"
)

func faraTimp(groups []string, a slog.Attr) slog.Attr {
    if a.Key == slog.TimeKey && len(groups) == 0 {
        return slog.Attr{} // un atribut gol nu este afișat
    }
    return a
}

func main() {
    logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp}))
    db := logger.WithGroup("db").With("gazda", "localhost")
    interogare := db.WithGroup("interogare")
    interogare.Info("interogare lentă", "tabel", "comenzi", "ms", 840)
}

Rezultat

{"level":"INFO","msg":"interogare lentă","db":{"gazda":"localhost","interogare":{"tabel":"comenzi","ms":840}}}

Greșeli frecvente

  • Te aștepți ca atributele adăugate cu With înainte de WithGroup să intre în grup. Rămân în afara lui; ordinea apelurilor contează.

Comenzi înrudite

  • slog.Group: Grupează mai multe atribute sub un nume comun: în text devin grup.cheie=…, în JSON un obiect.
  • slog.Logger.With: Returnează un logger nou care adaugă automat atributele date la fiecare mesaj.
  • slog.Logger: Tipul jurnalului structurat: are metodele Debug, Info, Warn, Error, Log și creează loggeri derivați cu With.