slog.Info în Go

Scrie în jurnalul structurat implicit un mesaj de nivel INFO, cu perechi cheie-valoare.

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

Ce face slog.Info

Pachetul log/slog (Go 1.21) aduce jurnalizarea structurată: în loc de o propoziție liberă, fiecare mesaj are un nivel (DEBUG, INFO, WARN, ERROR), un text scurt și câmpuri cheie=valoare, ușor de căutat și de filtrat.

slog.Info("mesaj", "cheie1", valoare1, "cheie2", valoare2) scrie un mesaj de nivel INFO. După mesaj urmează perechi alternante cheie, valoare (sau atribute gata făcute ca slog.Int("cheie", 5)). go vet verifică perechile.

Fără configurare, jurnalul implicit trimite mesajele prin pachetul log, deci pe stderr cu data în față: 2025/03/14 10:30:00 INFO mesaj cheie=valoare. În aplicații reale setezi un handler text sau JSON cu slog.SetDefault. În exemplele de mai jos eliminăm atributul time (funcția faraTimp), ca rezultatul să fie același la fiecare rulare.

Parametri

Parametru Descriere
msg Mesajul scurt, de obicei fix (nu formatat).
args Perechi cheie, valoare sau valori slog.Attr.

Ce returnează

Nimic.

Exemple

Exemplul 1: Jurnalul implicit

package main

import "log/slog"

func main() {
    slog.Info("comandă plasată", "id", 1042, "client", "Ana Popescu", "total", 249.9)
}

Rezultat (pe stderr; data și ora sunt cele curente)

2025/03/14 10:30:00 INFO comandă plasată id=1042 client="Ana Popescu" total=249.9

Exemplul 2: Cu handler text, pe ieșirea standard

Valorile cu spații sunt puse între ghilimele, ca rândul să poată fi citit înapoi de un program.

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

    slog.Info("comandă plasată", "id", 1042, "client", "Ana Popescu", "total", 249.9)
    slog.Info("utilizator autentificat", "email", "mihai@exemplu.ro", "admin", false)
}

Rezultat

level=INFO msg="comandă plasată" id=1042 client="Ana Popescu" total=249.9
level=INFO msg="utilizator autentificat" email=mihai@exemplu.ro admin=false

Exemplul 3: Cu handler JSON

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

    slog.Info("comandă plasată", "id", 1042, "oras", "Iași", "produse", []string{"carte", "pix"})
}

Rezultat

{"level":"INFO","msg":"comandă plasată","id":1042,"oras":"Iași","produse":["carte","pix"]}

Greșeli frecvente

  • Formatezi valorile în mesaj: slog.Info(fmt.Sprintf("comanda %d plasată", id)). Pierzi avantajul structurii; scrie slog.Info("comandă plasată", "id", id).
  • Uiți o valoare: slog.Info("x", "id"). La rulare apare cheia !BADKEY; go vet semnalează greșeala la verificare.

Comenzi înrudite

  • slog.Warn: Scrie în jurnalul implicit un mesaj de nivel WARN: ceva neobișnuit, dar programul continuă normal.
  • slog.Error: Scrie în jurnalul implicit un mesaj de nivel ERROR, de obicei împreună cu eroarea primită.
  • slog.Debug: Scrie un mesaj de nivel DEBUG, cu detalii pentru depanare; implicit aceste mesaje nu sunt afișate.
  • slog.SetDefault: Face un logger jurnalul implicit, folosit de slog.Info, slog.Error etc. și de pachetul log.
  • slog.NewTextHandler: Creează un handler care scrie fiecare mesaj ca un rând de perechi cheie=valoare (format logfmt).
  • slog.String: Creează un atribut tipizat (text, întreg, boolean) pentru un mesaj slog, în locul perechii cheie, valoare.