slog.Error în Go

Scrie în jurnalul implicit un mesaj de nivel ERROR, de obicei împreună cu eroarea primită.

Sintaxă
func Error(msg string, args ...any)

Ce face slog.Error

slog.Error marchează o operație eșuată. Convenția este să pui eroarea ca atribut cu cheia "err" sau "eroare": slog.Error("salvare eșuată", "err", err). Handler-ul afișează textul erorii (err.Error()).

Spre deosebire de log.Fatal, slog.Error nu oprește programul: doar scrie mesajul. Tu decizi apoi dacă returnezi, reîncerci sau oprești.

Parametri

Parametru Descriere
msg Mesajul.
args Perechi cheie, valoare; de obicei și eroarea.

Ce returnează

Nimic.

Exemple

Exemplul 1: Eroare cu context

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

    _, err := os.ReadFile("comenzi-martie.csv")
    if err != nil {
        slog.Error("nu pot citi comenzile", "fisier", "comenzi-martie.csv", "err", err)
    }
    slog.Info("programul continuă")
}

Rezultat

level=ERROR msg="nu pot citi comenzile" fisier=comenzi-martie.csv err="open comenzi-martie.csv: no such file or directory"
level=INFO msg="programul continuă"

Exemplul 2: Eroarea în format JSON

package main

import (
    "errors"
    "fmt"
    "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
}

var ErrPlataRefuzata = errors.New("plata refuzată de bancă")

func main() {
    slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp})))

    err := fmt.Errorf("comanda 1042: %w", ErrPlataRefuzata)
    slog.Error("plată eșuată", "err", err, "suma", 249.9)
}

Rezultat

{"level":"ERROR","msg":"plată eșuată","err":"comanda 1042: plata refuzată de bancă","suma":249.9}

Greșeli frecvente

  • Scrii eroarea și o și returnezi, iar funcția de deasupra o scrie din nou. Aceeași eroare apare de mai multe ori în jurnal; scrie-o o singură dată, unde o tratezi.
  • Te aștepți ca slog.Error să oprească programul. Nu o face; returnează sau ieși explicit.

Comenzi înrudite

  • slog.Warn: Scrie în jurnalul implicit un mesaj de nivel WARN: ceva neobișnuit, dar programul continuă normal.
  • slog.Info: Scrie în jurnalul structurat implicit un mesaj de nivel INFO, cu perechi cheie-valoare.
  • slog.Any: Creează un atribut cu o valoare de orice tip: structuri, liste, map-uri, erori.
  • log.Fatal: Scrie mesajul în jurnal și oprește imediat programul cu codul 1 (ca log.Print urmat de os.Exit(1)).