00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Logging e Slog in Go

Go offre il pacchetto log per il logging base e, a partire da Go 1.21, il pacchetto log/slog per il logging strutturato. Vediamo entrambi gli approcci.

Pacchetto log (Base)

import "log"

func main() {
    log.Println("Applicazione avviata")
    log.Printf("Porta: %d\n", 8080)
}
// Output: 2026/02/06 10:30:00 Applicazione avviata

log.Fatal e log.Panic

file, err := os.Open("config.json")
if err != nil {
    log.Fatal("Impossibile aprire config:", err)
    // Stampa il messaggio e chiama os.Exit(1)
}

// log.Panic stampa il messaggio e causa un panic
log.Panic("Errore critico!")

Logger Personalizzato

logger := log.New(os.Stdout, "APP: ", log.Ldate|log.Ltime|log.Lshortfile)
logger.Println("Messaggio personalizzato")
// Output: APP: 2026/02/06 10:30:00 main.go:15: Messaggio personalizzato

Flag disponibili: log.Ldate, log.Ltime, log.Lmicroseconds, log.Llongfile, log.Lshortfile, log.LUTC.

Pacchetto log/slog (Go 1.21+)

slog è il pacchetto standard per il logging strutturato, che produce log in formato chiave-valore o JSON.

Utilizzo Base

import "log/slog"

func main() {
    slog.Info("Server avviato", "porta", 8080)
    slog.Warn("Connessione lenta", "latenza_ms", 250)
    slog.Error("Query fallita", "errore", err, "query", sql)
    slog.Debug("Dati ricevuti", "bytes", 1024)
}
// Output: 2026/02/06 10:30:00 INFO Server avviato porta=8080

Livelli di Log

slog supporta quattro livelli: Debug, Info, Warn, Error.

// Impostare il livello minimo
opts := &slog.HandlerOptions{
    Level: slog.LevelDebug,
}
logger := slog.New(slog.NewTextHandler(os.Stdout, opts))
slog.SetDefault(logger)

Handler JSON

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
slog.SetDefault(logger)

slog.Info("Utente connesso", "id", 42, "nome", "Mario")
// Output: {"time":"2026-02-06T10:30:00Z","level":"INFO","msg":"Utente connesso","id":42,"nome":"Mario"}

Attributi Tipizzati

slog.Info("Richiesta completata",
    slog.String("metodo", "GET"),
    slog.Int("status", 200),
    slog.Duration("durata", 150*time.Millisecond),
    slog.Any("headers", headers),
)

Gruppi di Attributi

slog.Info("Richiesta",
    slog.Group("http",
        slog.String("metodo", "POST"),
        slog.Int("status", 201),
    ),
    slog.Group("utente",
        slog.Int("id", 42),
    ),
)
// JSON: {"msg":"Richiesta","http":{"metodo":"POST","status":201},"utente":{"id":42}}

Logger con Contesto

// Crea un logger con attributi fissi
logger := slog.Default().With(
    slog.String("servizio", "api"),
    slog.String("versione", "1.0"),
)

logger.Info("Avvio") // Include sempre servizio e versione

Conclusione

Per applicazioni semplici il pacchetto log è sufficiente, ma per applicazioni in produzione slog è la scelta raccomandata. Il logging strutturato di slog facilita il parsing automatico dei log, l’integrazione con sistemi di monitoraggio e la ricerca nei log in ambienti distribuiti.