Seite 1 von 1

Logging in Sub-Modulen

Verfasst: Samstag 14. Juni 2008, 17:31
von Spark
Hallo zusammen,
ich versuche logging instanzen global zu beeinflussen, was mir aber nicht richtig gelingen will. Folgendes Beispiel ist in pep-0282 enthalten:

MyModule.py

Code: Alles auswählen

import logging
log = logging.getLogger("MyModule")
def doIt():
    log.info("doin' stuff")
    #do stuff...but suppose an error occurs?
    raise TypeError, "bogus type error for testing"
MyApp.py

Code: Alles auswählen

import mymodule, logging

logging.basicConfig()

log = logging.getLogger("MyApp")
log.setLevel(logging.DEBUG) #set verbosity to show all messages of severity >= DEBUG
log.info("Starting my app")
try:
    mymodule.doIt()
except Exception, e:
    log.exception("There was a problem.")
log.info("Ending my app")
In der Konsolenausgabe sollte auch der log Eintrag aus mymodule (Zeile5) vorkommen, was er aber nicht tut:

INFO:MyApp:Starting my app
ERROR:MyApp:There was a problem.
Traceback (most recent call last):
File "C:\Programme\Python25\myApp.py", line 9, in <module>
mymodule.doIt()
File "C:\Programme\Python25\mymodule.py", line 7, in doIt
raise TypeError, "bogus type error for testing"
TypeError: bogus type error for testing
INFO:MyApp:Ending my app

Dieses Verhalten beobachte ich bei mir in Python 2.3 als auch in 2.5.
Hat jemand von Euch eine Idee, was bei diesem Beispiel falsch gelaufen ist?
Spark

Verfasst: Samstag 14. Juni 2008, 17:44
von CM
Was passiert, wenn

Code: Alles auswählen

log.info("doin' stuff")
zu

Code: Alles auswählen

logging.info("doin' stuff")
wird? (ggf. auch mal .flush() probieren)

Gruß,
Christian

Verfasst: Samstag 14. Juni 2008, 17:53
von Spark
Die Ausgabe ist dieselbe vie vorhin. Allerdings möchte ich gerne weiterhin auf einen separaten logger zugreiffen um auch das jeweils beteiligte Modul in einem Eintrag anzeigen zu können...

Verfasst: Montag 16. Juni 2008, 08:05
von Spark
Das Beispiel ist in pep-0282 nicht über alle Zweifel erhaben. Eine Erweiterung des Namens ins notwendig, damit sich der Logger im selben Ast befindet wie das darunterliegende Modul.

MyModule.py

Code: Alles auswählen

import logging
log = logging.getLogger("MyApp.MyModule")
def doIt():
    log.info("doin' stuff")
    #do stuff...but suppose an error occurs?
    raise TypeError, "bogus type error for testing"

In einem komplexeren Projekt müssen also die Loggernamen in den Modulen angepasst werden, sofern man auf spezifischen Ästen loggen möchte.