logging in 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
pug
User
Beiträge: 16
Registriert: Dienstag 4. September 2007, 17:00

Hallo,

ich bin gerade dabei eine Library in Python zu schreiben. In diese Library möchte ich gerne logging Funktionen einbinden. Ich stelle mir folgendes vor:

1. in der Libary/dem Modul sind die Statements definiert (ala DEBUG(„debugmeldung“)
2. In der Haupanwendung soll ein globaler Logger für die Anwendung konfiguriert sein.
3. wenn ich Klassen und Funktionen aus der Libary/dem Modul verwende sollen die Einstellungen des Loggers aus der Hauptanwendung verwendet werden.

Ich habe mir zu diesem Thema mal das logging Modul angeschaut, mir ist allerdings nicht klar wie ich damit so ein Verhalten realisieren soll.

Hat jemand Ideen wie ich das angehen könnte oder gibt es Alternativen zum logging Modul mit denen das funktioniert.

Grüße
Pug
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Einen sehr simplen Logger, der sowohl in sys.stdout als auch in eine Datei schreiben kann, kannst du hier sehen. Es ist nicht die schönste Implementation aber eine recht simple/anpassungsfähige.

Diesen Logger kannst du einfach modifizieren und später in deiner Applikation instanzieren und dann einfach an alle Modul-Funktionen übergeben.

Einfacher währe es, wenn man mit ''threadin._local'' threads arbeitet, was aber ein klein wenig komplizierter ist. Dann währe es möglich den Logger aus allen Modulen zu erreichen ohne das er via argument an die Funktion weitergegeben werden muss.


MfG EnTeQuAk
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Was spricht gegen den Gebrauch des logging-Moduls? Ich habe das in eine eigene Library erfolgreich eingebunden.

Gruss,
Christian
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dachte mir gerade, daß meine Antwort vielleicht nicht ausreichend ist. Also ein Beispiel mit dem logging-Modul.
Mal angenommen das Hauptmodul hat den wunderschönen Namen "mainmodule.py" und importiert seinerseits ein Modul names "slave.py" ;-). Dann könnte in mainmodule.py folgendes stehen:

Code: Alles auswählen

import logging
logging.basicConfig(level=logging.INFO,
                    format='%(levelname)-8s %(message)s',
                    filename='logfile.log',
                    filemode='w')
                              
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)

import slave.py
und jetzt weiter in slave.py:

Code: Alles auswählen

import logging
logging.debug("logging erfolgreich importiert - diese Nachricht kommt aber nicht auf der Konsole")
Hilft das weiter? Mein Beispiel ist aber fast dasselbe wie in der Doku zum Modul ;-). Allerdings gibt zur Zeit noch Probleme: http://bugs.python.org/issue1180193, was aber mit jeder ähnlichen Art logging umzusetzen passieren wird, bis der Bug in CPython selber gelöst ist.

Gruß,
Christian

edit: DEBUG natürlich klein geschrieben ...
Zuletzt geändert von CM am Dienstag 16. Oktober 2007, 15:08, insgesamt 2-mal geändert.
pug
User
Beiträge: 16
Registriert: Dienstag 4. September 2007, 17:00

Hallo Christian,

danke - das war genau das, was ich gesucht habe. Ich hatte beim Testen lediglich "slave.py" vor der Konfiguration des Loggers importiert... :oops:

Danke für die schnelle und hilfreiche Antwort.

Grüße
Pug
Antworten