"Sinnvolle" logfiles aus mehreren Modulen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
tiax
User
Beiträge: 152
Registriert: Samstag 23. Juli 2005, 17:28
Kontaktdaten:

Hi,

als erstes etwas ernsthafteres Projekt mache ich mir einen kleinen IRC-Bot, ohne Frameworks oder so.

Ich möchte recht viele Dinge mitloggen. Dazu habe ich eine zweite .py Datei erstellt, log.py mit Namen. Da drin gibt es einige Klassen, etwa BildschirmLogger, der im Grunde halt einfach alles mit print ausgibt anstatt in eine Datei zu loggen. Dann gibts da noch EinzelDateiLogger, der alles in eine Datei schreibt und bald wohl noch VerzeichnisLogger, der dann, sortiert nach Kritierien, in mehrere Dateien schreibt.

Der Bot besteht jetzt aus einer Klasse. Die heißt ircverbindung und hat als Funktion dann auch einen dieser Logger eingebaut. Sprich

Code: Alles auswählen

self.logger = EinzelDateiLogger
der wurde davor mit import natürlich reingeholt.

Jetzt stehen die Grundfunktionen und der Bot an sich läuft schonmal. Die "Features" möchte ich über module machen, wie schon beim Logging. Etwa als Beispiel habe ich eine kleine Funktion in einer stuff.py (ohne Klassen da drin) erstellt, die mit return etwas zurück gibt, deren Rückgabe dann per message ausgegeben wird. Aber das nur am Rande. Nun würde ich auch gern von den fremden Modulen aus ins log schreiben, etwa wenn bei einer FUnktion dort etwas schief läuft.

Im Bot selbst ist es mit self.logger.log('blabla...') ja kein Problem, aber wie kann ich eben diese Funktion aufrufen, wenn self was ganz andres bedeutet?

Vermutlich war das jetzt furchtbar kompliziert erklärt, Verzeihung, gut möglich ist aber auch, dass mein ganzer Ansatz etwas umständlich ist...
Ne invoces expellere non possis
[url=xmpp://florian@florianheinle.de]xmpp:florian@florianheinle.de[/url]
BlackJack

In dem neuen Modul kannst Du doch dein `log` auch importieren und den logger in dem Modul entweder über `log.name` ansprechen oder den Logger mit ``from log import name`` in das Modul "holen".

Fürs Logging gibt's in der Standardbibliothek übrigens schon ein fertiges Modul: `logging`.
Benutzeravatar
tiax
User
Beiträge: 152
Registriert: Samstag 23. Juli 2005, 17:28
Kontaktdaten:

Ja, aber gibts das dann nicht Probleme,wenn die beiden Logdinger gleichzeitig in die gleiche Datei schreiben wollen? Ist das eine Race-Condition? Red ich Müll?

Danke für den Hinweis auf das Logging-Modul, aber das erschienmir ein wenig oversized für meine Zwecke (aber auch da kann ich mich irren)
Ne invoces expellere non possis
[url=xmpp://florian@florianheinle.de]xmpp:florian@florianheinle.de[/url]
BlackJack

Wieso beide "Logdinger"? Ich ging davon aus, das es in Deinem `log` Modul *ein* Logger-Objekt gibt. Wenn Du das in mehreren anderen Modulen an einen Namen bindest, dann ist es doch immer das selbe Logger-Objekt.

Das nicht zwei Datei-Objekte in die gleiche Datei schreiben, da sollte man natürlich drauf achten. Andererseits sollte man beim Protokollieren sowieso am besten nur Zeilenpufferung einschalten und nach jedem schreiben sofort `flush()` aufrufen um sicher zu sein, dass der Protokolleintrag auch sofort rausgeschrieben wird. Dann macht's auch wieder nichts aus, wenn man von mehreren Datei-Objekten aus in die gleiche Datei schreibt, ausser man benutzt Threads.

Abschliessend: Das haben gute Programmierer alles schonmal durchdacht und in's `logging` Modul gesteckt. Ich finde das Ding auch nicht so toll, unter anderem weil man der API die Java-Herkunft ansieht, aber ich weiss wenigstens das es getesteter Code ist.
Antworten