Journalisation pour C++ : meilleures solutions
La journalisation est un composant critique de tout projet C++ sérieux. Elle permet de suivre l'exécution du programme, de trouver des erreurs, d'analyser les performances et d'auditer les actions des utilisateurs. Contrairement à Python, où le module intégré logging est la norme de facto, il n'existe pas de solution intégrée unique en C++. Cependant, la communauté a créé plusieurs bibliothèques puissantes et flexibles. Dans cet article, nous examinerons les meilleures d'entre elles : spdlog, Google glog, Boost.Log et Easylogging++.
Critères de choix d'une bibliothèque de journalisation
Avant de passer à la revue, il est important de comprendre sur quoi se concentrer lors du choix :
- Performance : impact minimal sur la vitesse d'exécution de l'application.
- Flexibilité : possibilité de configurer les formats, les niveaux de journalisation (DEBUG, INFO, WARN, ERROR) et les sorties (fichier, console, syslog).
- Simplicité d'intégration : les bibliothèques header-only sont préférables pour les petits projets.
- Support du multithreading : sécurité des threads et écriture asynchrone.
- Licence : compatibilité avec les projets commerciaux (MIT, Apache, Boost).
1. spdlog — le plus rapide et le plus moderne
spdlog est une bibliothèque header-only (optionnellement compilable), écrite en C++11/14/17. Elle est à juste titre considérée comme la plus populaire grâce à sa vitesse fulgurante et sa consommation mémoire minimale. spdlog prend en charge la journalisation asynchrone, ce qui est particulièrement important pour les systèmes à forte charge.
Fonctionnalités principales :
- Sécurité des threads prête à l'emploi.
- Multiples sinks : fichiers, console, syslog, fichiers rotatifs, fichiers quotidiens.
- Support des formatteurs personnalisés (basés sur fmtlib).
- Mode asynchrone avec file d'attente de messages.
- Journalisation conditionnelle.
Exemple d'utilisation :
#include "spdlog/spdlog.h"#include "spdlog/sinks/basic_file_sink.h"
int main() { // Création d'un logger écrivant dans un fichier auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/app.log"); spdlog::set_default_logger(file_logger); spdlog::set_level(spdlog::level::debug);
// Journalisation des messages spdlog::info("Application démarrée"); spdlog::warn("Comportement suspect détecté : {}", 42); spdlog::error("Erreur critique : {}", errno);
// Journalisation asynchrone spdlog::flush_every(std::chrono::seconds(3)); return 0;}Quand choisir : pour les projets modernes où la vitesse est critique. Idéal pour les jeux, les serveurs temps réel et les systèmes embarqués.
2. Google glog — un standard éprouvé par le temps
Google glog (Google Logging Library) est une bibliothèque développée par Google pour ses besoins internes. Elle est simple, fiable et utilisée dans des milliers de projets dans le monde entier. glog ne cherche pas à être le plus rapide, mais fournit toutes les fonctions nécessaires à la journalisation en production.
Caractéristiques :
- Rotation automatique des logs selon la taille.
- Niveaux de journalisation : INFO, WARNING, ERROR, FATAL (avec abort).
- Journalisation conditionnelle (LOG_IF, LOG_EVERY_N).
- Support de la pile d'appels en cas d'erreur fatale.
- Dépendance minimale — seulement pthreads.
Exemple d'utilisation :
#include <glog/logging.h>
int main(int argc, char* argv[]) { google::InitGoogleLogging(argv[0]); FLAGS_log_dir = "./logs"; FLAGS_minloglevel = google::INFO;
LOG(INFO) << "Serveur démarré sur le port " << 8080; LOG(WARNING) <