Logging für C++: Die besten Lösungen
Logging ist ein kritisch wichtiger Aspekt der Entwicklung jeder ernsthaften C++-Anwendung. Ein richtig konfiguriertes Logging-System ermöglicht es, den Programmstatus zu verfolgen, Fehler zu identifizieren, Audits durchzuführen und in der Produktionsumgebung zu debuggen. Im Gegensatz zu einfachen std::cout-Anweisungen bieten professionelle Bibliotheken Schweregrade (trace, debug, info, warn, error, fatal), Dateirotation, asynchrones Schreiben und minimale Auswirkungen auf die Leistung. In diesem Artikel betrachten wir drei der besten Lösungen für C++: spdlog, Google glog und P7.
1. spdlog – Schneller und moderner Logger
spdlog ist eine Header-Only-Bibliothek, geschrieben in C++11/14/17. Sie gilt als einer der schnellsten Logger im C++-Ökosystem. Hauptvorteile: Unterstützung des asynchronen Modus, zahlreiche Ausgabeformate (Konsole, Datei, Syslog, benutzerdefiniert), farbige Konsolenausgabe und minimaler Speicherverbrauch.
Beispiel für die grundlegende Verwendung:
#include "spdlog/spdlog.h"#include "spdlog/sinks/basic_file_sink.h"
int main() { // Erstellen eines Datei-Loggers auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/app.log"); // Festlegen des Log-Levels spdlog::set_level(spdlog::level::debug);
// Nachrichten loggen spdlog::info("Anwendung gestartet"); file_logger->warn("Benutzer {} hat versucht, sich mit falschem Passwort anzumelden", "admin"); file_logger->error("Fehler bei der Datenbankverbindung: {}", 404);
// Asynchrones Logging spdlog::flush_every(std::chrono::seconds(3)); return 0;}Hauptmerkmale:
- Leistung: Bis zu 5-10 Millionen Nachrichten pro Sekunde im asynchronen Modus.
- Flexibilität: Unterstützung von Sinks (Ausgaben) – Konsole, Datei, Syslog, Telegram, Kafka.
- Dateirotation: Automatische Erstellung von Logs nach Größe oder Zeit.
- Farbige Ausgabe: Level werden für eine schnelle visuelle Diagnose eingefärbt.
2. Google glog – Bewährter Logger
Google glog (glog) ist eine Bibliothek von Google, die für interne Unternehmensanforderungen entwickelt wurde. Sie ist einfach, zuverlässig und eignet sich hervorragend für Serveranwendungen. Der Schwerpunkt liegt auf der Kategorisierung von Logs und der automatischen Aufzeichnung in Dateien.
Anwendungsbeispiel:
#include <glog/logging.h>
int main(int argc, char* argv[]) { google::InitGoogleLogging(argv[0]);
// Konfiguration der Dateiausgabe FLAGS_log_dir = "./logs"; FLAGS_stderrthreshold = 1; // WARNING und höher auf stderr ausgeben
LOG(INFO) << "Server gestartet auf Port " << 8080; LOG(WARNING) << "Niedriger Arbeitsspeicher: " << 512 << " MB"; LOG(ERROR) << "Konfigurationsdatei konnte nicht geöffnet werden";
// Bedingtes Logging int x = 5; LOG_IF(INFO, x > 3) << "x ist größer als 3";
google::ShutdownGoogleLogging(); return 0;}Eigenschaften von glog:
- Automatische Rotation: Dateien werden nach Tagen und Größe erstellt.
- Bedingtes Logging:
LOG_IF,CHECKfür Überprüfungen. - Signalunterstützung: Protokolliert automatisch einen Stack-Dump bei Abstürzen.
- Minimale Konfiguration: Funktioniert "out of the box".
3. P7 – Logger für hochbelastete Systeme
P7 (oder P7::Logger) ist eine Bibliothek, die auf maximale Leistung und minimale Auswirkungen auf die Latenz der Anwendung ausgelegt ist. Sie verwendet eine asynchrone Warteschlange und minimiert Sperren. Ideal geeignet für Spiele-Engines, Finanzsysteme und