Ce face slog.Info
Pachetul log/slog (Go 1.21) aduce jurnalizarea structurată: în loc de o propoziție liberă, fiecare mesaj are un nivel (DEBUG, INFO, WARN, ERROR), un text scurt și câmpuri cheie=valoare, ușor de căutat și de filtrat.
slog.Info("mesaj", "cheie1", valoare1, "cheie2", valoare2) scrie un mesaj de nivel INFO. După mesaj urmează perechi alternante cheie, valoare (sau atribute gata făcute ca slog.Int("cheie", 5)). go vet verifică perechile.
Fără configurare, jurnalul implicit trimite mesajele prin pachetul log, deci pe stderr cu data în față: 2025/03/14 10:30:00 INFO mesaj cheie=valoare. În aplicații reale setezi un handler text sau JSON cu slog.SetDefault. În exemplele de mai jos eliminăm atributul time (funcția faraTimp), ca rezultatul să fie același la fiecare rulare.
Parametri
| Parametru | Descriere |
|---|---|
msg |
Mesajul scurt, de obicei fix (nu formatat). |
args |
Perechi cheie, valoare sau valori slog.Attr. |
Ce returnează
Nimic.
Exemple
Exemplul 1: Jurnalul implicit
package main
import "log/slog"
func main() {
slog.Info("comandă plasată", "id", 1042, "client", "Ana Popescu", "total", 249.9)
}
Rezultat (pe stderr; data și ora sunt cele curente)
2025/03/14 10:30:00 INFO comandă plasată id=1042 client="Ana Popescu" total=249.9
Exemplul 2: Cu handler text, pe ieșirea standard
Valorile cu spații sunt puse între ghilimele, ca rândul să poată fi citit înapoi de un program.
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() {
h := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp})
slog.SetDefault(slog.New(h))
slog.Info("comandă plasată", "id", 1042, "client", "Ana Popescu", "total", 249.9)
slog.Info("utilizator autentificat", "email", "mihai@exemplu.ro", "admin", false)
}
Rezultat
level=INFO msg="comandă plasată" id=1042 client="Ana Popescu" total=249.9
level=INFO msg="utilizator autentificat" email=mihai@exemplu.ro admin=false
Exemplul 3: Cu handler 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() {
h := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp})
slog.SetDefault(slog.New(h))
slog.Info("comandă plasată", "id", 1042, "oras", "Iași", "produse", []string{"carte", "pix"})
}
Rezultat
{"level":"INFO","msg":"comandă plasată","id":1042,"oras":"Iași","produse":["carte","pix"]}
Greșeli frecvente
- Formatezi valorile în mesaj:
slog.Info(fmt.Sprintf("comanda %d plasată", id)). Pierzi avantajul structurii; scrieslog.Info("comandă plasată", "id", id). - Uiți o valoare:
slog.Info("x", "id"). La rulare apare cheia!BADKEY;go vetsemnalează greșeala la verificare.
Comenzi înrudite
slog.Warn: Scrie în jurnalul implicit un mesaj de nivel WARN: ceva neobișnuit, dar programul continuă normal.slog.Error: Scrie în jurnalul implicit un mesaj de nivel ERROR, de obicei împreună cu eroarea primită.slog.Debug: Scrie un mesaj de nivel DEBUG, cu detalii pentru depanare; implicit aceste mesaje nu sunt afișate.slog.SetDefault: Face un logger jurnalul implicit, folosit de slog.Info, slog.Error etc. și de pachetul log.slog.NewTextHandler: Creează un handler care scrie fiecare mesaj ca un rând de perechi cheie=valoare (format logfmt).slog.String: Creează un atribut tipizat (text, întreg, boolean) pentru un mesaj slog, în locul perechii cheie, valoare.