Ankündigung

Einklappen

ETS5 Sammelbestellung Vollversion

Infos unter: Link
Mehr anzeigen
Weniger anzeigen

Logging in Logiken

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Logging in Logiken

    Hallo zusammen,

    eine Frage zum Logging aus Funktionen in Logiken heraus. In folgendem Beispiel sehe ich im Logfile nur die Nachricht, "Starting logic test.py". Wie bekomme ich hin, dass die Info "Logging event A" aus der Funktion doSomething auch geloggt wird? Hier die Beispiellogik sowie die Konfiguration der Logging.yaml:

    Code:
    #!/logics/test.py
    
    #Funktion in Logik:
    def doSomething(sh):
        logger.info("Logging event A")
        pass
    
    #Reguläre Logik:
    logger.info("Starting logic test.py")
    doSomething(sh)
    Logging.yaml:
    Code:
    logics.test:
        level: DEBUG
    Viele Grüße

    #2
    Wenn Du nicht noch einen allgemeinen Logger logics definiert hast in dem Du festlegst wohin geloggt werden soll, wird die Logausgabe von logics.test auf den main Logger geleitet und der nimmt in der Standardkonfiguration nur Level WARNING und höher an. Die Datei heisst deshalb auch smarthome-warnings.log.

    Bei mir sieht das in der logging.yaml folgendermaßen aus:
    Code:
        logics:
            handlers: [shng_details_file]
            level: WARNING
    sorgt dafür, dass aus allen Logiken WARNINGS und höher in das Details Log gehen.

    Dann reicht Dein Eintrag

    Code:
        logics.test:
            level: DEBUG
    damit die Log Ausgabe in die Datei kommt.

    Vorausgesetzt, Du hast den handler konfiguriert wie es standardmäßig vorgegeben ist (level: DEBUG)

    Standardmäßig ist der Handler für das Details Log folgendermaßen konfiguriert:
    Code:
        shng_details_file:
            class: logging.handlers.TimedRotatingFileHandler
            formatter: shng_simple
            level: DEBUG
            utc: false
            when: midnight
            backupCount: 7
            filename: ./var/log/smarthome-details.log
            encoding: utf8

    Weiterhin gilt: Eine Logik verhält sich nicht wie ein Modul. Es gibt hier keinen globalen Namnesraum. Was auf der obersten Ebene bekannt ist ist NICHT in Funktionen bekannt. Das bemerkst Du auch wenn Du eine Variable definierst. Die kennt die Funktion dann nicht. Dazu gibt es eine Beschreibung in der Doku: https://www.smarthomeng.de/user/logi...von-funktionen

    Deshalb ist unter anderem der Logger im Objekt logic definiert. Du solltest einfach überall logic.logger.info() verwenden. Das funktioniert in Funktionen auf der obersten Ebene.
    Zuletzt geändert von Msinn; 11.11.2020, 19:38.
    Viele Grüße
    Martin

    There is no cloud. It's only someone else's computer.

    Kommentar


      #3
      Danke Martin. Das Objekt logic und die Doku waren die entscheidenen Hinweise. Allerdings muss man das Objekt logic noch der Funktion übergeben. So funktionier es dann:

      Code:
      #!/logics/test.py
      
      #Funktion in Logik:
      def doSomething(sh, logic=logic):
          logic.logger.info("Logging event A")
          pass
      
      #Reguläre Logik:
      logger.info("Starting logic test.py")
      doSomething(sh)
      logger.yaml:
      Code:
      logics.test:
          level: DEBUG

      Kommentar

      Lädt...
      X