slog.Logger.Info în Go

Scrie un mesaj de nivel INFO prin acest logger, cu atributele lui (din With) și cele date în apel.

Sintaxă
func (l *Logger) Info(msg string, args ...any)
func (l *Logger) InfoContext(ctx context.Context, msg string, args ...any)

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 cu With.

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.