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.