Seite 1 von 1

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

Verfasst: Dienstag 13. Februar 2024, 12:41
von drnicolas
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?

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

Verfasst: Dienstag 13. Februar 2024, 13:10
von grubenfox
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...

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

Verfasst: Dienstag 13. Februar 2024, 13:16
von Sirius3
@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.

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

Verfasst: Dienstag 13. Februar 2024, 20:36
von __deets__
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.

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

Verfasst: Freitag 16. Februar 2024, 13:19
von x2wr0
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..;!

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

Verfasst: Sonntag 25. Februar 2024, 08:19
von drnicolas
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

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

Verfasst: Sonntag 25. Februar 2024, 10:14
von sparrow
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.