Was ist der effizienteste thread-sichere C ++ - Logger? [geschlossen]

85

Ich arbeite an einer leistungskritischen Multithread-Anwendung. Ich habe mir die Protokollierung von rlog, Ace und Boost angesehen. Ich habe mich für rlog entschieden, weil ich gelesen habe, dass es am schnellsten ist (wenn die Protokollierung deaktiviert ist, hat es den geringsten Overhead).

Das Problem, das ich habe, ist, dass der Dateiname, die Zeilennummer usw. auch im Freigabemodus angezeigt werden. Wenn Sie mir sagen können, wie ich diese Informationen ausschalten kann, ist mein Problem möglicherweise gelöst. Was ist auf jeden Fall der effizienteste Logger in C ++ für meine Situation?

cppalphadev
quelle
23
Ich komme schnell zu dem Schluss, dass Boost alles hat. Auch wenn dies nicht der Fall ist, ist es beim erneuten Betrachten aufgetreten!
Martin Beckett
19
Ich kann nicht sehen, warum dies geschlossen ist. Er stellte eine spezifische und messbare Frage. Wenn wir vernachlässigen, welcher Compiler verwendet wird, kann es nur einen "effizientesten thread-sicheren C ++ - Logger" geben. Stackoverflow in diesen Tagen ....
JohnJohn
1
Siehe auch github.com/gabime/spdlog
maxik

Antworten:

34

Leider kann ich momentan nicht abstimmen. Soweit ich sagen kann, benutze niemals Mist wie Apache log4cxx. Es enthält schwerwiegende Fehler.

  1. Die letzte Version von 0.9 branch ist 0.9.7 und enthält immer noch Speicherlecks, da jede Klasse mit virtuellen Mitgliedern keinen virtuellen dtor hat.
  2. Die neueste Version 0.10.x hat ab 0.9.x viele Funktionen verloren und ist nicht abwärtskompatibel. Sie sind gezwungen, einen Großteil Ihres eigenen Codes neu zu schreiben.
  3. Das ganze Projekt scheint nicht gepflegt zu sein. Die Veröffentlichung von 0.11.xx wurde für 2 Jahre angekündigt.

Meiner Meinung nach sollten Sie mit Boost gehen.

kirsche40
quelle
10
"Jede Klasse mit virtuellen Mitgliedern hat keinen virtuellen dtor" glaubte es nicht und musste es überprüfen. Ziemlich enttäuschend Apache.
ManuelSchneid3r
6
Sie können jetzt abstimmen :)
Fund Monica Klage
5
>> "Jede Klasse mit virtuellen Mitgliedern hat keinen virtuellen dtor" Das ist zwar nicht wunderbar, bedeutet aber nicht, dass es ein Problem verursacht. Dies ist nur dann ein Problem, wenn die Klassen eher nach ihrem dynamischen als nach ihrem statischen Typ gelöscht werden. Dies allein ist an sich kein Problem und bedeutet nicht, dass Speicher verloren geht.
Evidrix
1
@evilrix Die Klassen haben virtuelle Mitglieder, aber keinen virtuellen dtor. Die Klassen haben keine geschützten / privaten neuen Operatoren. Tatsächlich ist dies ein sehr schlechter und schlechter Code, der niemals veröffentlicht werden sollte. Also, was ist dein Punkt?
Kirsche40
@ kirsche40 Ich fand meinen Standpunkt ziemlich klar. Welchen Teil meiner Erklärung, wie der Standard formuliert ist, haben Sie nicht verstanden? Lassen Sie mich umformulieren: Es ist ein Problem, wenn Sie versuchen, über einen Basisklassenzeiger zu löschen. In diesem Fall ist das Verhalten undefiniert, wenn der Destruktor nicht virtuell ist. Der Standard ist in diesem Punkt ungewöhnlich klar. Ich bin mir ziemlich sicher, dass nichts von dem, was ich gesagt habe, impliziert, dass ich befürworte, dass das OP dies als Implementierung verwendet.
Evilrix
19

Pantheios gilt als die leistungsstärkste C ++ - Protokollierungsbibliothek und behauptet, die einzige zu sein, die zu 100% typsicher ist (siehe diesen Artikel über eine verwandte Bibliothek, in der erläutert wird, warum printf () / iostream-basierte Bibliotheken keine typbasierten Bibliotheken sind). sicher)

dcw
quelle
4
Und selbst wenn sie Pantheios nicht mögen, ist die Liste der "Konkurrenten" auf der von Ihnen verlinkten Seite informativ.
JWD
10

Ich hatte Erfolg mit log4cxx unter http://logging.apache.org/log4cxx/index.html . Es ist eine C ++ - Version des beliebten Log4j-Loggers, die entweder über eine conf-Datei oder im Code einfach zu konfigurieren ist. Der Overhead bei Deaktivierung ist minimal (Methodenaufruf und Ganzzahlvergleich).

Das Muster für die Ausgabe in das Protokoll wird durch ein Konvertierungsmuster definiert, das so einfach wie Datum / Uhrzeit und eine Nachricht sein kann. Es behandelt auch die Dateigrößenbeschränkung, den Rollover usw. Sie können auch verschiedene Muster für verschiedene Fehler und Quellen konfigurieren.

user54700
quelle
9

Hier erfahren Sie, wie Sie die zusätzlichen Informationen, die rlog bereitstellt (z. B. Dateiname, Zeilennummer usw.), deaktivieren können. Wenn Sie rlog in Ihrer main()Funktion (oder wo auch immer) initialisieren , können Sie Folgendes tun:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

Das zweite Argument StdioNodeist, dass Flags die Ausgabe steuern. Überprüfen Sie die rlog-Dokumentation (kann mit Doxygen generiert werden) auf die gesamte Liste möglicher Flags. Mit dem Beispiel hier färbt rlog die Ausgabe nur nach Schweregrad, ohne dass weitere Informationen hinzugefügt werden.

Maniok
quelle
9

Möglicherweise möchten Sie das Logog-System in Betracht ziehen. logog bietet genau diese Art von Funktionalität, weist jedoch nicht die impliziten Code-Abhängigkeiten auf, die Pantheios aufweist. logog ist threadsicher und ermöglicht ein hohes Maß an Kontrolle darüber, welche Arten von Nachrichten zu jedem Zeitpunkt protokolliert werden.

Ich bin der Autor und Betreuer von logog, daher ist meine Meinung etwas voreingenommen. Aber ich habe rlog, Pantheios und andere Protokollierungssysteme überprüft, bevor ich dieses implementiert habe.

https://github.com/johnwbyrd/logog .

Johnwbyrd
quelle
Aktualisierter Link, danke für den Hinweis.
Johnwbyrd
4

Ein Teil des Overheads kann in Ihren Makros / Streams auftreten. Sie müssen sehr vorsichtig sein, um die zu protokollierende Zeichenfolge nicht zu erstellen, wenn die Protokollierung deaktiviert ist.

Durch die clevere Verwendung von Streams und dem Operator ?: Können Sie dies ebenso tun wie Makros.


quelle
2

Vielleicht Pantheios,
obwohl ich nicht weiß, ob es threadsicher ist oder nicht ...

mhd
quelle
8
Es ist threadsicher
dcw
2

Probieren Sie die c-log lib https://github.com/0xmalloc/c-log aus , eine schnelle, stabile und threadsichere log lib für C / C ++.

user2538508
quelle
7
Leider befindet sich c-log unter der GPL, was bedeutet, dass Sie es nicht mit nicht GPL-kompatibler (z. B. proprietärer kommerzieller) Software verwenden können. Dies macht es für viele Benutzer unbrauchbar.
Chris
Jetzt gibt es keine LIZENZ in github.com/0xmalloc/c-log. Es ist kostenlos für den kommerziellen und persönlichen Gebrauch.
user2538508
2
Sind Sie der Autor von c-log? In diesem Fall empfehle ich Ihnen dringend, ausdrücklich anzugeben (auf der Github-Seite die Readme-Datei und die Kommentare im Quellcode), unter welcher Lizenz Ihre Software veröffentlicht wird. Auch wenn es gemeinfrei sein soll (was ich nicht empfehle!), Sollten Sie dies ausdrücklich angeben. Davon abgesehen stehen viele "kommerziell freundliche" (dh zulässige) Open Source-Lizenzen zur Auswahl - die beliebtesten sind Apache, BSD oder MIT.
Chris
Nur Linux? ( #include <pthread.h>...)
Rustyx