slog.String în Go

Creează un atribut tipizat (text, întreg, boolean) pentru un mesaj slog, în locul perechii cheie, valoare.

Sintaxă
func String(key, value string) Attr
func Int(key string, value int) Attr
func Bool(key string, value bool) Attr

Ce face slog.String

În loc de "oras", "Iași" poți scrie slog.String("oras", "Iași"). Rezultatul este un slog.Attr. Avantajele: compilatorul verifică tipul valorii, nu poți uita valoarea dintr-o pereche, iar handler-ul nu mai trebuie să ghicească tipul (puțin mai rapid).

Pentru alte tipuri există slog.Int64, slog.Uint64, slog.Float64, slog.Time, slog.Duration, slog.Any. Atributele și perechile simple pot fi amestecate în același apel.

Parametri

Parametru Descriere
key Numele câmpului.
value Valoarea, de tipul funcției.

Ce returnează

Un slog.Attr.

Exemple

Exemplul 1: Atribute tipizate

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.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp}))
    logger.Info("utilizator nou",
        slog.String("nume", "Ioana Ionescu"),
        slog.Int("varsta", 28),
        slog.Bool("newsletter", true),
        "oras", "Cluj-Napoca") // pereche simplă, amestecată
}

Rezultat

level=INFO msg="utilizator nou" nume="Ioana Ionescu" varsta=28 newsletter=true oras=Cluj-Napoca

Exemplul 2: Același mesaj în JSON

Tipurile se păstrează: numărul rămâne număr, booleanul rămâne boolean.

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}))
    logger.Info("utilizator nou",
        slog.String("nume", "Ioana Ionescu"),
        slog.Int("varsta", 28),
        slog.Bool("newsletter", true))
}

Rezultat

{"level":"INFO","msg":"utilizator nou","nume":"Ioana Ionescu","varsta":28,"newsletter":true}

Greșeli frecvente

  • Dai un număr ca text: slog.String("varsta", "28"). În JSON devine "28" și filtrele numerice nu mai merg; folosește slog.Int.

Comenzi înrudite

  • slog.Any: Creează un atribut cu o valoare de orice tip: structuri, liste, map-uri, erori.
  • slog.Duration: Creează un atribut cu o durată (time.Duration): în text apare ca 1.5s, în JSON ca număr de nanosecunde.
  • slog.Time: Creează un atribut cu o dată și oră (time.Time), scrisă în format RFC 3339.
  • slog.Group: Grupează mai multe atribute sub un nume comun: în text devin grup.cheie=…, în JSON un obiect.
  • slog.Info: Scrie în jurnalul structurat implicit un mesaj de nivel INFO, cu perechi cheie-valoare.