Logging für C++: Die besten Lösungen
Logging ist eines der wichtigsten Werkzeuge im Arsenal eines Entwicklers. Es hilft, die Programmausführung zu verfolgen, Fehler zu finden, die Leistung zu analysieren und Daten für das Debugging zu sammeln. Die Sprache C++ hat kein integriertes Logging-System (im Gegensatz zu Java oder Python), aber die Community und große Unternehmen haben viele hervorragende Bibliotheken entwickelt. In diesem Artikel betrachten wir die besten Lösungen für das Logging in C++: spdlog, Boost.Log, Google glog und fmtlog. Sie erfahren deren Besonderheiten, Vorteile und erhalten Codebeispiele.
Warum ist Logging in C++ notwendig?
In modernen C++-Projekten löst das Logging mehrere Aufgaben:
- Debugging: Aufzeichnung von Variablenwerten, Aufrufstapeln, Objektzuständen.
- Monitoring: Erfassung der Ausführungszeit von Funktionen, I/O-Operationen.
- Audit: Speicherung des Verlaufs von Benutzer- oder Systemaktionen.
- Fehlerdiagnose: Aufzeichnung von Ausnahmen und kritischen Fehlern.
Eine gute Logging-Bibliothek sollte schnell, flexibel sein, verschiedene Log-Level (debug, info, warn, error, fatal) unterstützen und Daten in eine Datei, Konsole oder einen entfernten Server ausgeben können.
1. spdlog – Schneller und moderner Logger
spdlog ist derzeit die beliebteste Bibliothek für das Logging in C++. Sie ist in modernem C++ (C++11/14/17) geschrieben, header-only (nur Header-Dateien) und hat keine externen Abhängigkeiten außer fmtlib für die String-Formatierung. Hauptvorteile:
- Hohe Leistung (asynchrones Logging).
- Unterstützung vieler Sinks: Datei, Konsole, syslog, Datenbanken.
- Flexible Formatierungskonfiguration.
- Einfache API.
Beispiel für die Verwendung von spdlog:
#include <spdlog/spdlog.h>#include <spdlog/sinks/basic_file_sink.h>
int main() { // Logger erstellen, der in die Datei "logs.txt" schreibt auto logger = spdlog::basic_logger_mt("file_logger", "logs.txt"); spdlog::set_default_logger(logger); spdlog::set_level(spdlog::level::debug); // Logging-Level
spdlog::info("Welcome to spdlog!"); spdlog::debug("Some debug message: {}", 42); spdlog::error("Error occurred: {}", errno);
// Asynchrones Logging spdlog::flush_on(spdlog::level::err); return 0;}spdlog unterstützt auch den asynchronen Modus, der für stark ausgelastete Anwendungen entscheidend ist. Die Konfiguration der Asynchronität ist trivial: Einfach spdlog::init_thread_pool(...) aufrufen.
2. Boost.Log – Leistungsstark, aber schwergewichtig
Boost.Log ist Teil der Boost-Bibliotheken. Es ist die funktionsreichste Lösung, erfordert jedoch die Installation von Boost und kann die Kompilierung verlangsamen. Besonderheiten:
- Maximale Flexibilität: benutzerdefinierte Filter, Formatierer, Sinks.
- Unterstützung von Multithreading und Thread-Sicherheit.
- Möglichkeit, Logs gleichzeitig an verschiedene Orte zu schreiben (Datei + Konsole + Netzwerk).
- Unterstützung der Log-Rotation nach Größe, Datum oder Zeit.
Beispiel für Boost.Log:
#include <boost/log/trivial.hpp>#include <boost/log/expressions.hpp>#include <boost/log/utility/setup/file.hpp>
namespace logging = boost::log;
int main() { // Ausgabe in Datei konfigurieren logging::add_file_log("sample.log"); logging::core::get()->set_filter( logging::trivial::severity >= logging::trivial::info );
BOOST_LOG_TRIVIAL(trace) << "A trace severity message"; BOOST_LOG_TRIVIAL(debug) << "A debug severity message"; BOOST_LOG_TRIVIAL(error) << "An error severity message"; return 0;}Boost.Log – die Wahl
Auch in der Bibliothek
Event Bus und das Observer-Pattern in Go (Golang): pub/sub-Implementierung
vitest für TypeScript: Komplette Anleitung mit Beispielen