Ce face slog.Logger.Info
logger.Info face ce face slog.Info, dar prin logger-ul tău, nu prin cel implicit. Mesajul primește întâi atributele adăugate cu With, apoi cele din apel.
InfoContext primește în plus un context.Context. Handler-ele standard nu folosesc contextul, dar handler-ele proprii pot citi din el, de exemplu ID-ul cererii HTTP sau ID-ul de trasare.
Parametri
| Parametru | Descriere |
|---|---|
msg |
Mesajul. |
args |
Perechi cheie, valoare sau slog.Attr. |
Ce returnează
Nimic.
Exemple
Exemplul 1: Mesaje prin logger-ul propriu
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("abonat nou", "email", "ana@exemplu.ro")
logger.Info("newsletter trimis", "destinatari", 1250, "durata_sec", 12.4)
}
Rezultat
{"level":"INFO","msg":"abonat nou","email":"ana@exemplu.ro"}
{"level":"INFO","msg":"newsletter trimis","destinatari":1250,"durata_sec":12.4}
Exemplul 2: InfoContext cu un ID de cerere
Un handler mic adaugă ID-ul cererii luat din context la fiecare mesaj.
package main
import (
"context"
"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
}
type cheieCerere struct{}
type handlerCuCerere struct {
slog.Handler
}
func (h handlerCuCerere) Handle(ctx context.Context, r slog.Record) error {
if id, ok := ctx.Value(cheieCerere{}).(string); ok {
r.AddAttrs(slog.String("cerere", id))
}
return h.Handler.Handle(ctx, r)
}
func main() {
baza := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp})
logger := slog.New(handlerCuCerere{baza})
ctx := context.WithValue(context.Background(), cheieCerere{}, "req-7f3a")
logger.InfoContext(ctx, "produse listate", "numar", 24)
logger.Info("fără context", "numar", 0)
}
Rezultat
level=INFO msg="produse listate" numar=24 cerere=req-7f3a
level=INFO msg="fără context" numar=0
Greșeli frecvente
- Folosești
slog.Info(logger-ul implicit) într-o componentă care a primit un logger propriu. Mesajele pierd atributele adăugate cuWith.
Comenzi înrudite
slog.Logger: Tipul jurnalului structurat: are metodele Debug, Info, Warn, Error, Log și creează loggeri derivați cu With.slog.Info: Scrie în jurnalul structurat implicit un mesaj de nivel INFO, cu perechi cheie-valoare.slog.Logger.With: Returnează un logger nou care adaugă automat atributele date la fiecare mesaj.