Das Thema logging wird an sich sehr breit behandelt. ich habe Dutzende von beiträgen gelesen/gesehen die sich mit der Materie beschäftigen, speziell mit dem Loggiing im Hauptprogramm und in Libraries
Wenn ich im Hauptprogramm einen getlooger mache, dann kann ich prima die verschiedenen Handler hinzufügen und loggen.
Aber wie geht das in einer Library, die vom Hauptprogramm aufgerufen wird?
Die Library kenn t ja nunmal den Logger des Hauptprogramms nicht.
Wenn ich es in der Library mit "logging.debug()" probiere, dann kommt es jedenfalls nicht im Logger des Hauptprogramms an.
Gibt es die ultimative Erklärung wie's geht?
Logging Im Hauptprogramm und in Library - wie geht's richtig?
Über eine Funktion der Library die von Hauptprogramm aufgerufen wird und in der das Hauptprogrmam seinen Logger der Library bekannt macht...
@grubenfox: es darf keine Abhängigkeit vom Hauptprogramm in eine Library geben.
Umgekehrt ist es richtig, eine Library erzeugt ihren eigenen Logger mit logging.getLogger und das Hauptprogramm kann dann, wenn nötig, individuelle Einstellungen pro Library vornehmen.
Umgekehrt ist es richtig, eine Library erzeugt ihren eigenen Logger mit logging.getLogger und das Hauptprogramm kann dann, wenn nötig, individuelle Einstellungen pro Library vornehmen.
Das logging.debug() sollte schon ankommen. Wenn es das nicht tut, machst du was falsch. Ein Klassiker: an mehr als an einer Stelle das logging konfigurieren. Das darf nur das Hauptprogramm. Dann kommt auch alles an.
Holá,
ein erster Schritt könnte beispielswiese folgendermaßen aussehen..
* lib/__init__.py
* evtl. noch lib/sub.py
* und final main.py
... .. . .
natürlich nicht zu vergessen..;!
ein erster Schritt könnte beispielswiese folgendermaßen aussehen..
* lib/__init__.py
Code: Alles auswählen
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())
Code: Alles auswählen
logger = logging.getLogger(f'lib.{__name__}')
logger.addHandler(logging.NullHandler())
Code: Alles auswählen
logger = logging.getLogger('lib')
# .. all die Konfigurationen kämen dann hierher.. (loglevel, stream-/filehandlers, formatters, etc.)
if __name__ = '__main__':
logger.info('jetzt geht\'s hier aber richtig los!')
Code: Alles auswählen
import logging
es gibt manche, die sind anders und andere, die sind genauso
Es will einfach nicht ...
Im Hauptprogramm:
Innerhalb main() kann ich nach Herzenslust loggen. Vondort wird eine Funktion im Modul identify.py aufgerufen.
Dann logger ich munter - aber es kommt nix an! Jedenfalls nicht an std out oder in der Datei. Zurück in main() ist dann alles wider schön.
Ich verstehs einfach nicht
Im Hauptprogramm:
Code: Alles auswählen
if __name__=='__main__':
mainlogger=logging.getLogger(__name__)
mainlogger.propagate
sysloghandler=handlers.SysLogHandler(address="/dev/log")
syslogformatter=logging.Formatter("%(filename)s : %(message)s")
sysloghandler.setFormatter(syslogformatter)
sysloghandler.setLevel(logging.INFO)
rothandler=handlers.RotatingFileHandler("link2MEDIStar.log","a",100000,3)
rotformatter=logging.Formatter('%(funcName)-21s %(lineno)-4s %(levelname)-9s: %(message)s')
rothandler.setFormatter(rotformatter)
rothandler.setLevel=logging.DEBUG
stream_handler=logging.StreamHandler()
stream_formatter=logging.Formatter('%(funcName)-21s %(lineno)-4s %(levelname)-9s: %(message)s')
stream_handler.setFormatter(stream_formatter)
stream_handler.setLevel=logging.DEBUG
smtphandler=handlers.SMTPHandler("mail.thomae.nickisch","autolink@orthopraxis.nickisch.cc","nico@thomae.nickisch","Problem autolink")
smtp_formatter=logging.Formatter('%(funcName)-21s %(lineno)-4s %(levelname)-9s: %(message)s')
smtphandler.setFormatter(smtp_formatter)
smtphandler.setLevel(logging.ERROR) #alles loggen oberhalb WARNING , i.e. ERROR, CRITICAL, EXCEPTION
mainlogger.addHandler(sysloghandler)
mainlogger.addHandler(rothandler)
mainlogger.addHandler(stream_handler)
mainlogger.addHandler(smtphandler)
main()
Code: Alles auswählen
logger=logging.getLogger(__name__)
logger.propagate
Ich verstehs einfach nicht
So wie ich das sehe - und um in deinem Wortlaut zu bleiben - konfigurierst du munter einen Logger; aber wo konfigurierst du denn das Logging?
Du fummelst da umständlich einen Logger zusammen, von dem kein anderes Modul etwas weiß und wunderst dich dann, dass die anderen Module da nicht loggen.
Die Dokumentation hat ein gutes howto. Damit würde ich starten.
Du fummelst da umständlich einen Logger zusammen, von dem kein anderes Modul etwas weiß und wunderst dich dann, dass die anderen Module da nicht loggen.
Die Dokumentation hat ein gutes howto. Damit würde ich starten.