Logging mit systemd-python

  • Hallo zusammen,


    aktuell versuche ich gerade bei meinem vorgestellten Projekt: Stromzähler mit Raspberry Pi und ModBus auslesen

    eine Umstellung bzw. Erweiterung zu vollziehen, mit systemd und Python in Kombination passend zur "loggen".

    Das das Projekt mit einer Service Unit gestartet wird, dachte ich es wär passend auch entsprechend "richtig" zu mit dem systemd Logger zu kommunizieren.

    Aktuell habe ich im Projekt nur einen Streamhandler in Verwendung. Alle Logmeldungen werden jetzt von Systemd unter dem Status info geführt.

    Somit ist mein Ziel jetzt, in Abhängigkeit dessen ob das Skript von einer ServiceUnit gestartet wurde oder manuell entweder einen StreamHandler() oder einen "Systemd Handler" zu aktivieren.


    :conf:Wie ich das genau anstelle weiß ich noch nicht, falls jemand eine Idee hat nur her damit ;)


    Zu meinem aktuell konkreten Problem:


    Python
    import logging
    from systemd import journal
    
    log = logging.getLogger('demo')
    log.addHandler(journal.JournaldLogHandler())
    log.setLevel(logging.INFO)
    log.info("sent to journal")

    Erzeugt mir im journal folgenden Eintrag:

    Code
    Aug 02 23:06:41 uvpi [13345]: sent to journal

    Sieht ja schon mal vielversprechend aus, was mir aber fehlt und das ist die Frage des Threads, wie schaffe ich es, dass ich auch noch die Anwendung im journal habe, so wie z.B:


    Code
    Aug 02 23:17:02 uvpi CRON[13657]: pam_unix(cron:session): session opened for use
    Aug 02 23:17:01 uvpi python3[12206]: 02.08.2018 23:17:01 INFO: Durchlaufdauer: 0

    Beim einen sieht man sofort dass es von CRON stammt um beim anderen von python3


    Installiertes Python Modul: python-systemd


    EDIT:

    Habe gerade bemerkt, dass wenn man über Jupyter folgendes aufführt die Logmeldung wie folgt aussieht:

    Python
    import logging
    from systemd import journal
    
    log = logging.getLogger('custom_logger_name')
    log.propagate = False
    log.addHandler(journal.JournalHandler())
    
    log.warning("Some message: %s", 'detail')


    Code
    Aug 02 23:38:20 wetterstation /usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py[5563]: Some message: detail

    Somit die ergänzende Frage, denn hier ist mir natürlich die absolute Pfadangabe zu lange, wie kann ich das allgemein Manipulieren?

  • Fields to be attached to all messages sent through this handler can be specified as keyword arguments. This probably makes sense only for SYSLOG_IDENTIFIER and similar fields which are constant for the whole program:

    Code
    >>> JournalHandler(SYSLOG_IDENTIFIER='my-cool-app')
    <...JournalHandler ...>

    The following journal fields will be sent: MESSAGE, PRIORITY, THREAD_NAME, CODE_FILE, CODE_LINE, CODE_FUNC, LOGGER (name as supplied to getLogger call), MESSAGE_ID (optional, see above), SYSLOG_IDENTIFIER (defaults to sys.argv[0]).

  • ja, :daumendreh2:was soll ich sagen, da war ich gestern auch schon....hab da das ganze nur anders interpretiert. Funktioniert jedenfalls so wie gewünscht :danke_ATDE:



    :conf: Wie ich das genau anstelle weiß ich noch nicht, falls jemand eine Idee hat nur her damit ;)

    Hat hierbei noch wer eine Idee? Da finde ich gerade noch gar nichts :notfunny:

  • So mein Skript zur Erstellung der Logging Instanz in Abhängigkeit ob es manuell oder per Service Unit gestartet worden ist hab ich fertig und funktioniert schon mal so wie ich mir das Vorgestellt habe.


    Da wir in Python keinen Code Snippets Bereich haben, gibts das Skript hier im Anhang. Vielleicht kann es der ein oder andere mal gebrauchen.

    So ein Code Snippet Bereich wärs mal :conf: