Logging pour Go (Golang) : meilleures solutions et outils
Le logging est l'un des composants clés de toute application de production en Go. Il permet de suivre les erreurs, d'analyser le comportement du système et de réaliser des audits. Il existe de nombreuses bibliothèques de logging en Go, chacune avec ses propres caractéristiques, performances et facilité d'utilisation. Dans cet article, nous examinerons les meilleures solutions : du package standard log aux bibliothèques haute performance zap et zerolog, ainsi que le nouveau standard slog.
1. Package standard log
Le package intégré log est le moyen le plus simple de commencer à logger en Go. Il ne nécessite pas l'installation de dépendances tierces et convient aux petits projets ou au prototypage rapide.
Caractéristiques :
- API minimaliste :
Print,Printf,Println,Fatal,Panic. - Prise en charge des préfixes et des indicateurs (date, heure, fichier).
- Par défaut, affiche dans
os.Stderr. - Ne prend pas en charge le logging structuré « prêt à l'emploi ».
package main
import "log"
func main() { log.Println("Ceci est un message simple") log.Printf("L'utilisateur %s s'est connecté", "admin") log.Fatal("Erreur critique — l'application va se terminer")}Quand l'utiliser : pour des scripts, des utilitaires, des tests ou lorsque des formats complexes ne sont pas nécessaires.
2. logrus — logging structuré
Logrus est l'une des bibliothèques les plus populaires pour Go. Elle offre un logging structuré avec prise en charge des niveaux, des champs et du formatage (JSON, texte).
Caractéristiques :
- Niveaux : Trace, Debug, Info, Warn, Error, Fatal, Panic.
- Prise en charge des hooks pour envoyer les logs vers des services tiers.
- Formatage flexible : TextFormatter, JSONFormatter.
- Possibilité d'ajouter des champs contextuels.
package main
import ( "github.com/sirupsen/logrus")
func main() { log := logrus.New() log.SetFormatter(&logrus.JSONFormatter{}) log.WithFields(logrus.Fields{ "user": "admin", "ip": "192.168.1.1", }).Info("Utilisateur authentifié")}Inconvénient : performances inférieures à celles des bibliothèques plus récentes (zap, zerolog).
3. zap — logging ultra-rapide par Uber
Zap d'Uber est une bibliothèque axée sur des performances maximales. Elle utilise la réflexion uniquement lorsque nécessaire et propose deux modes : SugaredLogger (pratique, plus lent) et Logger (rapide, nécessite un typage strict).
Caractéristiques :
- Très grande vitesse : jusqu'à 10 fois plus rapide que logrus.
- Prise en charge du logging structuré avec champs.
- Configuration flexible : niveaux, sortie fichier/console, rotation.
- Sécurité : n'alloue pas de mémoire dans le chemin critique.
package main
import ( "go.uber.org/zap")
func main() { logger, _ := zap.NewProduction() defer logger.Sync()
logger.Info("Serveur démarré", zap.String("port", "8080"), zap.Int("workers", 10), )}Quand l'utiliser : microservices à forte charge, systèmes en temps réel.
4. zerolog — minimalisme et performances
Zerolog est une autre bibliothèque haute performance qui met l'accent sur zéro allocation et la simplicité. Elle est livrée avec une excellente documentation et une prise en charge intégrée du JSON par défaut.
Caractéristiques :
- Allocations mémoire minimales.
- Prise en charge des niveaux, champs, sous-loggers.
- Pretty-printing intégré pour le développement.
- Po