Logging Im Hauptprogramm und in Library - wie geht's richtig?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drnicolas
User
Beiträge: 87
Registriert: Sonntag 24. Juli 2016, 10:32

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?
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

drnicolas hat geschrieben: Dienstag 13. Februar 2024, 12:41 Die Library kenn t ja nunmal den Logger des Hauptprogramms nicht.
Über eine Funktion der Library die von Hauptprogramm aufgerufen wird und in der das Hauptprogrmam seinen Logger der Library bekannt macht...
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
x2wr0
User
Beiträge: 17
Registriert: Freitag 7. Februar 2020, 16:38
Kontaktdaten:

Holá,
ein erster Schritt könnte beispielswiese folgendermaßen aussehen..

* lib/__init__.py

Code: Alles auswählen

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())
* evtl. noch lib/sub.py

Code: Alles auswählen

logger = logging.getLogger(f'lib.{__name__}')
logger.addHandler(logging.NullHandler())
* und final main.py

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
natürlich nicht zu vergessen..;!
es gibt manche, die sind anders und andere, die sind genauso
drnicolas
User
Beiträge: 87
Registriert: Sonntag 24. Juli 2016, 10:32

Es will 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()
Innerhalb main() kann ich nach Herzenslust loggen. Vondort wird eine Funktion im Modul identify.py aufgerufen.

Code: Alles auswählen

logger=logging.getLogger(__name__)
logger.propagate
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
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

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.
Antworten