Logging, wie richtig?
-
geht nicht
-
äh, sicher geht das..
Du hast also zB. so eine Funktion:
void func(char* msg, int level);
Dann sieht das Macro so aus:
#define dbg(msg, level) func(msg, level)
bzw. das Dummy-Macro nur so:
#define dbg(msg, level)
-
wäre vielleicht noch zu erwähnen, dass man bei der argumentübergabe keine seiteneffekte haben sollte. Also nicht dbg(socket = connect()) oder sowas schreiben.
-
kk. Alles klar
-
was heißt kk? kacke?
-
k = ok
kk = ok ok
-
borg schrieb:
k = ok
kk = ok ok
thx. ok ok hört sich für mich an wie leck mir am arsch dran
-
kk=kaykay=okayokay
War einer schneller...
Wie siehts eigentlich mit Parameterlisten aus?
Log(String , ...); ?
-
#ifdef DEBUG
#define log_debug(expr) std::cerr << expr << std::endl
#else
#define log_debug(expr)
#endifDamit kann man auch was formatiertes ausgeben wie:
log_debug("Der Wert der Variablen a ist " << a);
-
Makros sind in C++ böse. Bedient euch mal einem professionellen Logger. Wo man auch beim Kunden das Logging ein und ausschalten kann, ohne den Compiler neu zu starten. Sondern das man nur ebend mal eine Konfig-Datei ändert oder einen Menüpunkt einrichtet. Oder wollt ihr bei jedem Kunden der ein Problem hat den Compiler starten oder mit mehreren EXE-Dateien rumhantieren?
Log4Cxx hat nicht nur ein On/Off sondern auch Log-Level, so kann man die Logs leveln und je nach Situation oder Projektfortschritt den Level hoch oder runter drehen.
-
Makros sind nicht grundsätzlich böse. Sie haben durchaus ihre Daseinsberechtigung.
Das Beispiel soll halt nur darstellen, wie es einfach gemacht werden kann. Log4cxx ist natürlich die bessere Lösung.
Log4cxx ist allerdings in einem Zwischenzustand, der die Bibliothek augenblicklich nicht wirklich nutzbar macht. Die Version 0.9.7 ist veraltet und 0.9.8, welches auf apr (apache portable runtime) setzt, ist noch nicht fertig.
Sehr flexibel ist man mit meiner Meta-logging-library aus den cxxtools (http://www.tntnet.org/cxxtools.bhtm). Da wird zur compile-zeit der cxxtools bestimmt, welche logging-library im Hintergrund werkeln soll. Die API bleibt die gleiche (dank Makros!). Log4cxx, log4cplus und eine eigene einfache Implementierung wird unterstützt. Eine komplette Deaktivierung des loggings ist auch möglich. Mein Webapplicationserver für c++ tntnet (http://www.tntnet.org) ist ein Beispiel. Es kann mit allen drei Bibliotheken compiliert werden.
Von cxxtools stammt übrigens dieses Makro log_debug. Na - da ist es natürlich etwas ausgefeilter. Es berücksichtigt die aktuelle Logstufe der aktuellen Loggingkategorie.