slog.Group în Go

Grupează mai multe atribute sub un nume comun: în text devin grup.cheie=..., în JSON un obiect.

Sintaxă
func Group(key string, args ...any) Attr

Ce face slog.Group

slog.Group("cerere", "metoda", "GET", "cale", "/produse") creează un singur atribut care conține alte atribute. Handler-ul text le scrie cu prefix (cerere.metoda=GET cerere.cale=/produse), iar cel JSON ca obiect imbricat ("cerere":{"metoda":"GET",...}).

Grupurile țin ordinea în jurnale cu multe câmpuri și evită coliziunile de nume (de exemplu cerere.id și utilizator.id). Pentru a pune toate atributele următoare într-un grup, folosește logger.WithGroup.

Parametri

Parametru Descriere
key Numele grupului.
args Atributele din grup: perechi cheie, valoare sau slog.Attr.

Ce returnează

Un slog.Attr de tip grup.

Exemple

Exemplul 1: Grupuri în text și în JSON

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 _, logger := range []*slog.Logger{
        slog.New(slog.NewTextHandler(os.Stdout, opt)),
        slog.New(slog.NewJSONHandler(os.Stdout, opt)),
    } {
        logger.Info("cerere servită",
            slog.Group("cerere", "metoda", "GET", "cale", "/produse", "id", "a1b2"),
            slog.Group("utilizator", slog.Int("id", 7), slog.String("oras", "Iași")),
            "status", 200)
    }
}

Rezultat

level=INFO msg="cerere servită" cerere.metoda=GET cerere.cale=/produse cerere.id=a1b2 utilizator.id=7 utilizator.oras=Iași status=200
{"level":"INFO","msg":"cerere servită","cerere":{"metoda":"GET","cale":"/produse","id":"a1b2"},"utilizator":{"id":7,"oras":"Iași"},"status":200}

Greșeli frecvente

  • Creezi un grup gol: slog.Group("extra"). Handler-ele nu afișează grupurile goale, deci nu apare nimic.

Comenzi înrudite

  • slog.Logger.WithGroup: Returnează un logger nou care pune toate atributele următoare într-un grup cu numele dat.
  • slog.Any: Creează un atribut cu o valoare de orice tip: structuri, liste, map-uri, erori.
  • slog.String: Creează un atribut tipizat (text, întreg, boolean) pentru un mesaj slog, în locul perechii cheie, valoare.