Logging in C++: Best Practices für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Logging in C++-Anwendungen: Best Practices für Anfänger



Logging (Protokollierung) ist der Prozess der Aufzeichnung von Ereignissen, die während der Programmausführung auftreten. Für einen angehenden C++-Entwickler ist die Fähigkeit, Logging richtig zu organisieren, nicht nur eine "gute Praxis", sondern eine kritisch wichtige Fähigkeit. Es hilft beim Debuggen von Code, beim Verfolgen von Fehlern in der Produktion und bei der Analyse des Systemverhaltens. In diesem Artikel werden wir die besten Praktiken für Logging in C++ behandeln, von den einfachsten Methoden bis zur Verwendung moderner Bibliotheken, mit konkreten Codebeispielen.



Warum ist die einfache Verwendung von std::cout eine schlechte Praxis?



Viele Anfänger beginnen mit der Ausgabe von Debug-Nachrichten über std::cout oder printf. Das ist schnell und einfach, aber dieser Ansatz hat schwerwiegende Nachteile:



  • Fehlende Wichtigkeitsstufen. Fehlermeldungen können nicht von Informationsmeldungen getrennt werden.
  • Schwierige Filterung. In der Produktion möchte man keine Unmengen von Debug-Nachrichten sehen, beim Debuggen werden sie jedoch benötigt.
  • Keine Dateirotation. Die Logdatei wächst unbegrenzt, bis die gesamte Festplatte gefüllt ist.
  • Probleme mit Multithreading. Ausgaben aus verschiedenen Threads können sich vermischen.


Stattdessen sollten spezialisierte Werkzeuge verwendet werden. Betrachten wir drei Hauptansätze: vom Einfachen zum Komplexen.



1. Einfacher Makro-Wrapper für Anfänger



Wenn Sie ein kleines Übungsprogramm schreiben oder keine externen Bibliotheken einbinden möchten, können Sie einen einfachen Wrapper mit Makros erstellen. Das ist bereits besser als ein nacktes cout.



#include <iostream>#include <fstream>#include <ctime>#include <string>

enum LogLevel { DEBUG, INFO, WARNING, ERROR};

std::string getCurrentTime() { std::time_t now = std::time(nullptr); char buf[20]; std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", std::localtime(&now)); return std::string(buf);}

#define LOG(level, msg) \ do { \ std::ofstream logFile("app.log", std::ios::app); \ logFile << "[" << getCurrentTime() << "] " \ << "[" << #level << "] " \ << msg << std::endl; \ } while(0)

int main() { LOG(INFO, "Programm gestartet"); int x = 42; LOG(DEBUG, "Wert von x: " << x); // ... LOG(ERROR, "Fehler: Division durch Null aufgetreten"); return 0;}


Vorteile: Einfachheit, keine externen Abhängigkeiten erforderlich.

Nachteile: Keine Rotation, langsame Ausführung (Datei öffnen/schließen für jede Nachricht), Probleme mit Threads.



2. Verwendung der Bibliothek spdlog (empfohlen für Anfänger)



spdlog ist die beliebteste Bibliothek für Logging in C++ (über 23.000 Sterne auf GitHub). Sie ist sehr schnell, einfach zu bedienen und header-only (nur Header-Dateien).



Installation: Laden Sie einfach die Dateien aus dem Repository herunter oder verwenden Sie vcpkg/conan.



#include <spdlog/spdlog.h>#include <spdlog/sinks/basic_file_sink.h>#include <spdlog/sinks/stdout_color_sinks.h>

int main() { // Erstellen eines Konsolen-Loggers mit farbiger Ausgabe auto console = spdlog::stdout_color_mt("console"); // 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); // Alle Nachrichten ab DEBUG und höher loggen // Beispiele für Nachrichten verschiedener Level console->trace("Dies ist eine trace-Nachricht (niedrigste Stufe)"); console->debug("Debug-Nachricht: Variable x = {}", 42); console->info("Programm erfolgreich gestartet"); console->warn("P

Blogs

Buchempfehlungen