Globale Klasse für Logging
-
Singletons? Bei jedem getInstance() muss ein Mutex herangezogen werden, das ist wirklich obermühsam. Globale Variablen die von der main initialisiert werden sind da nicht nur schneller, sondern meistens auch notwendig, denn meistens will man das ja konfigurierbar haben (sonst würde clog ausreichen).
-
doubletown schrieb:
Singletons? Bei jedem getInstance() muss ein Mutex herangezogen werden, das ist wirklich obermühsam.
Wer sagt, dass wir Threads nutzen?
Jetzt kommt möglicherweise Bullshit:
Außerdem lässt sich dass mit einer Thread-Model Policy anpassbar machen.
-
So ein Vorgehen verringert die Wiederverwendbarkeit deiner Komponenten ungemein.
-
doubletown schrieb:
Singletons? Bei jedem getInstance() muss ein Mutex herangezogen werden, das ist wirklich obermühsam. Globale Variablen die von der main initialisiert werden sind da nicht nur schneller, sondern meistens auch notwendig, denn meistens will man das ja konfigurierbar haben (sonst würde clog ausreichen).
Wenn die Logaufrufe den Logger selbst nicht verändern dann würde ich doch eher die Output-Streams schützen und nicht die Logger-Instanz. Ich mache das so und das funktioniert super.
-
Singleton ist hier Schwachsinn. Man macht ein Logger Klasse, und eine globale Variable. Oder, wenn man das Erzeugen verzögern möchte, eine freie Funktion die eine Referenz auf ein statisches Objekt zurückgibt. Ein Mutex wird hier selbstverständlich nicht benötigt*, man gibt nur eine Referenz zurück. Die Logger Klasse selbst sollte natürlich synchronisieren, ob die das jetzt lock-free oder sonst wie macht ist aber egal.
-
cooky: und wenn man dann sein programm mit nem c++ 98/2003 compiler baut ist es dann nicht mehr safe? ganz schön riskant sich darauf zu verlassen.
-
reply31 schrieb:
cooky: und wenn man dann sein programm mit nem c++ 98/2003 compiler baut ist es dann nicht mehr safe? ganz schön riskant sich darauf zu verlassen.
Die erste Log-Zeile "Programm wurde gestartet" hat man schon raus, bevor weitere Threads gestartet werden.
-
random unreg: Dann ist einem eh nicht mehr zu helfen.
-
cooky451 schrieb:
Singleton ist hier Schwachsinn. Man macht ein Logger Klasse, und eine globale Variable.
Was ist der Unterschied? Singleton macht man doch mit einer globalen Variable die man versteckt.
-
gerad eein Logger ist etwas, wo ich es verstehen kann, wenn es mehrere Instanzen gibt. Es kann gut sein, dass ich in einm Debug-Programmdurchlauf einen Teil der Ausgaben nicht in die Datei umleeiten will, sondern ins Konsolenfenste rum eine beestimmte Komponente genauer zu beobachten. ODer ich hab verschiedene Log-level die in verschiedene Dateien umgeleitet werden...
-
otze schrieb:
gerad eein Logger ist etwas, wo ich es verstehen kann, wenn es mehrere Instanzen gibt. Es kann gut sein, dass ich in einm Debug-Programmdurchlauf einen Teil der Ausgaben nicht in die Datei umleeiten will, sondern ins Konsolenfenste rum eine beestimmte Komponente genauer zu beobachten. ODer ich hab verschiedene Log-level die in verschiedene Dateien umgeleitet werden...
Das kenne ich per Übergabe eines ints als Loglevel.
Mir kam niemals in den Sinn, mehrere Logger zu nehmen.
Ob die Leglevels nur ein dummer Trick sind, um mehrer Logger zu ersparen? Neee, die hängen auch zu arg mit < und > zusammen.
-
otze schrieb:
gerad eein Logger ist etwas, wo ich es verstehen kann, wenn es mehrere Instanzen gibt.
Gerade beim Logger ist doch eine Instanz sinnvoll, denn man hat in der Regel nur eine oder twei Dateien, in die aber andere Inhalte kommen (z.B. stdout und stderr) sowie das Konsolenfenster. Mehrere Instanzen, die das gleiche machen und in die Konsole schreiben, sind doch unnötig.
-
http://ideone.com/gsnRGR
Neat, nicht wahr?
-
Indeed.
-
-
-
Noch template daraus bauenund in basic_ostream_group umbenennen, dann gibt's von mir auch ein .Edit: Bla. Ist ja schon ein Template.
-
Einen hab' ich noch: http://ideone.com/tqWJpV
-
Hallo Leute,
vielen Dank für die vielen Tipps!
Jetzt muss ich mir noch die beste Lösung für mein Projekt überlegen.
Greets,
Antonios.