[Python-de] Fragge zu logging

Diez B. Roggisch deets at web.de
Fr Jul 20 08:58:41 UTC 2007


On Friday 20 July 2007 10:07:01 Bastian Venthur wrote:
> Hi Liste,
>
> ich hab hier ein komisches Problem mit loggern. Um es zu demonstrieren
> hier ein minimales Beispiel:
>
> === main.py ===
>
> import logging
> import module1
>
> if __name__ == "__main__":
>     logging.basicConfig(level=logging.DEBUG, format="%(name)-12s
> %(levelname)-8s %(message)s")
>     logger = logging.getLogger()
>     logger.info("Logger initialized")
>
>     module1.foo()
>
> === module1.py ===
>
> import logging
>
> logger = logging.getLogger("module1")
> logger.debug("Logger initialized")
>
> def foo():
>     logger.debug("Entered foo()")
>
> === Ausgabe von python main.py ===
> root         INFO     Logger initialized
> module1      DEBUG    Entered foo()
>
>
> Meine Frage: Warum wurde logger.debug("Logger initialized") in
> module1.py nicht ausgeführt? Ein print an der Stelle würde etwas ausgeben.
>
> Das ist nur die minimale Varianbe meines Prolbems. Ich habe in einem
> Projekt in jedem Modul auf Modulebene einen Logger (sie heißen alle
> "logger"). Manchmal muss auf Modulebene aber außerhalb von Funktionen
> etwas geloggt werden, und entweder kommt gar nichts oder z.B. innerhalb
> eines try/exept Blockes auf Modulebene auch gerne mal eine Fehlermeldung
> "No handlers could be found for logger foo". Innerhalb von Funktionen
> dagegen gibt es keine Probleme.
>
> Irgendwie versteh ich das nicht, kann mir jemand auf die Sprünge helfen?

Nun, wenn du bereits beim import etwas ausgibst, aber erst die 
logging-facilities in deinem __name__=="__main__"-Konstrukt initialisierst - 
was erwartest du? A muss vor B kommen. Ist halt so. Also entweder machst du 

logging.basicConfig(level=logging.DEBUG, 
format="%(name)-12s  %(levelname)-8s %(message)s")

in deinen main-modul vor allem anderen - oder du packst die log-ausgaben der 
importierten module in irgendwelchen init-code.

Diez