Introduction : pourquoi la journalisation en Go ne se résume pas à fmt.Println
La journalisation est les yeux et les oreilles de toute application fonctionnant en production. Dans le monde de Go (Golang), l'approche de la journalisation a considérablement évolué : de la simple sortie console via fmt.Println aux puissants journaux structurés capables de produire des enregistrements compatibles JSON pour les systèmes de collecte centralisée de logs (ELK, Grafana Loki, Datadog).
Dans cet article, nous analyserons les meilleures pratiques de journalisation en Go en pratique, et non en théorie. Vous apprendrez à configurer les niveaux de journalisation, à utiliser des logs structurés, à éviter le "bruit" et à gérer correctement les erreurs. Tous les exemples de code sont prêts à être utilisés dans vos projets.
1. La bibliothèque standard log : quand est-elle suffisante et quand ne l'est-elle pas ?
Go fournit le package intégré log de la bibliothèque standard. Il est simple, mais présente des limitations importantes.
Exemple de base
package main
import ( "log" "os")
func main() { // Configuration de la sortie vers un fichier file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) defer file.Close() log.SetOutput(file)
log.Println("Application démarrée") log.Printf("Utilisateur %s authentifié", "admin") log.Fatal("Erreur critique : impossible de se connecter à la base de données")}Avantages :
- Ne nécessite pas l'installation de dépendances tierces.
- Simplicité d'utilisation pour les petits scripts ou les utilitaires CLI.
Inconvénients :
- Pas de niveaux de journalisation (uniquement Print, Fatal, Panic).
- Format de sortie fixe (date, heure, message).
- Pas de champs structurés (clé-valeur).
- Difficile à analyser par les systèmes de collecte de logs.
Conclusion : pour les services de production, l'architecture de microservices ou toute application nécessitant une surveillance, le log standard ne convient pas. Passez à la journalisation structurée.
2. Journalisation structurée avec zerolog : le standard moderne
La bibliothèque zerolog est l'un des journaux les plus populaires et les plus rapides en Go. Elle prend en charge les niveaux de journalisation, la sortie JSON par défaut et une allocation mémoire minimale.
Installation
go get -u github.com/rs/zerolog/logExemple de configuration et d'utilisation
package main
import ( "os" "time"
"github.com/rs/zerolog" "github.com/rs/zerolog/log")
func main() { // Configuration du format de l'heure zerolog.TimeFieldFormat = time.RFC3339
// Sortie console avec couleurs (pour le développement) log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339})
// Pour la production — JSON dans stdout // log.Logger = zerolog.New(os.Stdout).With().Timestamp().Logger()
log.Info().Msg("Serveur démarré sur le port 8080") log.Debug().Str("module", "auth").Msg("Tentative de connexion de l'utilisateur") log.Error().Err(err).Str("user_id", "12345").Msg("Erreur d'authentification") log.Fatal().Int("attempt", 3).Msg("Nombre de tentatives dépassé")}Niveaux de journalisation dans zerolog
- Trace (
log.Trace()) — pour le débogage approfondi. - Debug (
log.Debug()) — informations de débogage. - Info (
log.Info()) — événements normaux. - Warn (
log.Warn()) — avertissements (pas des erreurs). - Error (
log.Error()) — erreurs nécessitant une attention. - Fatal (
log.Fatal()) — erreurs fatales (termine le programme). - Panic (
log.Panic()) — panique avec affichage de la pile.
Meilleure pratique : en production, définissez un minimum