slog.SetDefault în Go

Face un logger jurnalul implicit, folosit de slog.Info, slog.Error etc. și de pachetul log.

Sintaxă
func SetDefault(l *Logger)

Ce face slog.SetDefault

slog.SetDefault înlocuiește logger-ul global. După apel, slog.Info, slog.Warn și celelalte funcții de pachet scriu prin logger-ul dat. Se apelează o dată, la începutul lui main.

Efect important: și pachetul vechi log este redirecționat. log.Println("x") devine un mesaj de nivel INFO în formatul handler-ului ales, deci bibliotecile care folosesc log ajung în același jurnal.

Parametri

Parametru Descriere
l Logger-ul care devine implicit.

Ce returnează

Nimic. slog.Default() returnează logger-ul implicit curent.

Exemple

Exemplul 1: Configurare la pornire

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() {
    slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp})))

    slog.Info("server pornit", "port", 8080)
    salveaza()
}

func salveaza() {
    slog.Info("date salvate", "inregistrari", 37) // folosește tot logger-ul implicit
}

Rezultat

{"level":"INFO","msg":"server pornit","port":8080}
{"level":"INFO","msg":"date salvate","inregistrari":37}

Exemplul 2: Și pachetul log trece prin slog

package main

import (
    "log"
    "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() {
    slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp})))
    log.Println("mesaj scris cu pachetul log vechi")
    log.Printf("comanda %d procesată", 1042)
}

Rezultat

level=INFO msg="mesaj scris cu pachetul log vechi"
level=INFO msg="comanda 1042 procesată"

Greșeli frecvente

  • Apelezi SetDefault din mai multe locuri (biblioteci, teste). Doar aplicația, în main, ar trebui să aleagă jurnalul implicit.

Comenzi înrudite

  • slog.New: Creează un *slog.Logger care trimite mesajele unui handler (text, JSON sau propriu).
  • slog.Info: Scrie în jurnalul structurat implicit un mesaj de nivel INFO, cu perechi cheie-valoare.
  • log.Println: Scrie un mesaj în jurnal, precedat de dată și oră; Println pune spații între valori, Print ca fmt.Print.