
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? Schöne Grüße, Bastian -- Bastian Venthur http://venthur.de Debian Developer venthur at debian org

Hallo, On 7/20/07, Bastian Venthur <venthur@debian.org> 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.
Es wird ausgeführt! Allerdings zum Zeitpunkt des imports in main.py, also bevor in main.py logging.basicConfig() ausgeführt wird. Wenn ich mal raten soll, dann würde ich sagen, daß der Default-Logging-Level höher als DEBUG ist und deshalb das logging.debug("Logger initialized") in module1.py stumm bleibt. wenn Du "debug" in "error" änderst, also den Logging-Level hochsetzt, bekommst Du eine Fehlermeldung, wohl weil der Logger (noch) nicht konfiguriert ist. Wenn Du logging.basicConfig() in main.py direkt nach den "import logging" und noch vor "import module1" setzt, dann ist auch alles konfiguriert und die Ausgabe erscheint wie erwartet. Gruß, Heiko

On 20.07.2007 10:49 schrieb Heiko Gerlach:
Es wird ausgeführt! Allerdings zum Zeitpunkt des imports in main.py, also bevor in main.py logging.basicConfig() ausgeführt wird. Wenn ich mal raten soll, dann würde ich sagen, daß der Default-Logging-Level höher als DEBUG ist und deshalb das logging.debug("Logger initialized") in module1.py stumm bleibt. wenn Du "debug" in "error" änderst, also den Logging-Level hochsetzt, bekommst Du eine Fehlermeldung, wohl weil der Logger (noch) nicht konfiguriert ist.
Hmm das war so offensichtlich, das es direkt peinlich ist nicht selbst darauf gekommen zu sein. Danke! -- Bastian Venthur http://venthur.de Debian Developer venthur at debian org

Bastian Venthur schrieb:
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?
Deine modulweiten Statements in module1 werden ausgeführt, *bevor* logging.basicConfig von main.py aufgerufen wird. Deshalb verhält sich logger.debug() falsch. (Ersetzt du es mit .error(), bekommst du die angesprochene Fehlermeldung). Die Lösung ist also, logging.basicConfig() vor dem Import von module1 aufzurufen, oder entsprechendes. Georg -- Thus spake the Lord: Thou shalt indent with four spaces. No more, no less. Four shall be the number of spaces thou shalt indent, and the number of thy indenting shall be four. Eight shalt thou not indent, nor either indent thou two, excepting that thou then proceed to four. Tabs are right out.

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
participants (4)
-
Bastian Venthur
-
Diez B. Roggisch
-
Georg Brandl
-
Heiko Gerlach