slog.New în Go

Creează un *slog.Logger care trimite mesajele unui handler (text, JSON sau propriu).

Sintaxă
func New(h Handler) *Logger

Ce face slog.New

În slog, Logger-ul este partea pe care o apelezi (Info, Warn, With), iar Handler-ul decide formatul și destinația. slog.New(h) leagă cele două.

Handler-ele din biblioteca standard sunt slog.NewTextHandler (cheie=valoare) și slog.NewJSONHandler (un obiect JSON pe rând). Poți avea mai mulți loggeri cu handler-e diferite sau poți face unul dintre ei implicit cu slog.SetDefault.

Parametri

Parametru Descriere
h Handler-ul; nu poate fi nil.

Ce returnează

Un *slog.Logger nou.

Exemple

Exemplul 1: Doi loggeri, două formate

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}
    text := slog.New(slog.NewTextHandler(os.Stdout, opt))
    json := slog.New(slog.NewJSONHandler(os.Stdout, opt))

    text.Info("factură emisă", "nr", 1042, "client", "Ana")
    json.Info("factură emisă", "nr", 1042, "client", "Ana")
}

Rezultat

level=INFO msg="factură emisă" nr=1042 client=Ana
{"level":"INFO","msg":"factură emisă","nr":1042,"client":"Ana"}

Exemplul 2: Logger transmis unei componente

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
}

type Mailer struct {
    log *slog.Logger
}

func (m Mailer) Trimite(catre, subiect string) {
    m.log.Info("e-mail trimis", "catre", catre, "subiect", subiect)
}

func main() {
    logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp}))
    m := Mailer{log: logger.With("componenta", "mailer")}
    m.Trimite("ana@exemplu.ro", "Comanda ta a fost expediată")
}

Rezultat

level=INFO msg="e-mail trimis" componenta=mailer catre=ana@exemplu.ro subiect="Comanda ta a fost expediată"

Greșeli frecvente

  • Apelezi slog.New(nil): programul se oprește cu panică.

Comenzi înrudite

  • slog.NewTextHandler: Creează un handler care scrie fiecare mesaj ca un rând de perechi cheie=valoare (format logfmt).
  • slog.NewJSONHandler: Creează un handler care scrie fiecare mesaj ca un obiect JSON pe un rând, potrivit pentru servere și cloud.
  • slog.SetDefault: Face un logger jurnalul implicit, folosit de slog.Info, slog.Error etc. și de pachetul log.
  • slog.Logger: Tipul jurnalului structurat: are metodele Debug, Info, Warn, Error, Log și creează loggeri derivați cu With.