Einige dieser Antworten deuten darauf hin, dass Sie am Anfang eines Moduls Folgendes tun:
import logging
logger = logging.getLogger(__name__)
Meines Wissens nach gilt dies als sehr schlechte Praxis. Der Grund dafür ist, dass die Dateikonfiguration standardmäßig alle vorhandenen Logger deaktiviert. Zum Beispiel:
#my_module
import logging
logger = logging.getLogger(__name__)
def foo():
logger.info('Hi, foo')
class Bar(object):
def bar(self):
logger.info('Hi, bar')
Und in Ihrem Hauptmodul:
#main
import logging
# lade mein Modul - das konfiguriert jetzt den Logger
import my_module
# Dies deaktiviert nun standardmäßig den Logger in meinem Modul, [siehe die Dokumentation][1]
logging.config.fileConfig('logging.ini')
my_module.foo()
bar = my_module.Bar()
bar.bar()
Jetzt wird das im logging.ini festgelegte Protokoll leer sein, da der vorhandene Logger durch den Aufruf von fileconfig deaktiviert wurde.
Es ist sicherlich möglich, dies zu umgehen (disable_existing_Loggers=False), aber realistisch betrachtet werden viele Kunden Ihrer Bibliothek dieses Verhalten nicht kennen und keine Protokolle erhalten. Machen Sie es Ihren Kunden einfach, indem Sie logging.getLogger immer lokal aufrufen. Hut ab: Ich habe dieses Verhalten auf Victor Lins Website gelernt.
Die gute Praxis besteht also darin, logging.getLogger immer lokal aufzurufen. Zum Beispiel:
#my_module
import logging
logger = logging.getLogger(__name__)
def foo():
logging.getLogger(__name__).info('Hi, foo')
class Bar(object):
def bar(self):
logging.getLogger(__name__).info('Hi, bar')
Außerdem, wenn Sie fileconfig in Ihrem Hauptmodul verwenden, setzen Sie disable_existing_loggers=False, nur für den Fall, dass die Designer Ihrer Bibliothek Logger-Instanzen auf Modulebene verwenden.