Ankündigung

Einklappen
Keine Ankündigung bisher.

[CORE]Logging jetzt konfigurierbar

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

    [CORE]Logging jetzt konfigurierbar

    Moin,
    ich habe im develop branch Änderungen am Logging commited. Das Logging kann jetzt über die Datei /etc/logging.yaml gesteuert werden.

    Da zur Konfiguration YAML verwendet wird muss dies zuerst auf dem Rechner installiert werden:
    Code:
    sudo pip install pyyaml
    bzw. auf älteren Installationen wie z.B. Raspberry PI mit älterem Python dann alternativ
    Code:
    sudo pip-3.2 install pyyaml
    Die Datei logging.yaml befindet sich bereits vorkonfiguriert in dem Verzeichnis.

    Die Datei sieht so aus:
    Code:
    version: 1
    disable_existing_loggers: False
    formatters:
      simple:
        format: '%(asctime)s %(levelname)-8s %(threadName)-12s %(message)s'
        datefmt: '%Y-%m-%d  %H:%M:%S'
      detail:
        format: '%(asctime)s %(levelname)-8s %(module)-12s %(threadName)-12s %(message)s -- %(filename)s:%(funcName)s:%(lineno)d'
        datefmt: '%Y-%m-%d %H:%M:%S'
    handlers:
      console:
        class: logging.StreamHandler
        formatter: simple
        stream: ext://sys.stdout
      file:
        class: logging.handlers.TimedRotatingFileHandler
        level: DEBUG
        formatter: detail
        when: midnight
        backupCount: 7
        filename: ./var/log/smarthome.log
    loggers:
      plugins.knx:
        level: DEBUG
    #  lib.scheduler:
    #    level: DEBUG
    #  plugins.cli:
    #    level: DEBUG
    root:
        level: INFO
        handlers: [file, console]
    In die Konfigurationsmöglichkeiten kann sich hier eingelesen werden:
    https://docs.python.org/3.4/library/...logging.config
    https://docs.python.org/3.4/library/...module-logging

    Die einzelnen Konfigurationseinträge haben die folgende Bedeutung:
    formatters: Definiert das Ausgabeformat der einzelnen Loggingeinträge. Mehrere unterschiedliche formatter können dazu verwendet werden um unterschiedlich aussehende Logdateien zu erzeugen.
    handlers: Handler definieren die Log-Behandlungsroutinen/Ausgabekanäle die verwendet werden. In Python gibt es bereits mehrere vorimplementiert und mächtige Handler die hier beschrieben sind:
    https://docs.python.org/3.4/library/...gging.handlers

    loggers: Hier werden die einzelnen Logger definiert und was mit diesen Einträgen passiert, welche handler und formatter verwendet werden. Das Level konfiguriert dabei die Logtiefe für die einzelne Komponente. Bei den loggern ist nun möglich einzelne Plugins oder Libs im Debug protokollieren zu lassen. Dazu sind in der Konfiguration bereits einige Beispiele.
    Root: Hier ist die Konfiguration des Root-Loggers der für die ganze Anwendung gilt. Dieser Root-Logger wird für alle Komponente verwendet die nicht unter loggers: konfiguriert sind.

    An der Doku zum Logging arbeite ich noch, aber darüber wurden bereits auch schon ganze Bücher geschrieben.

    Für die Entwickler von Plugins:
    Der Logger sollte nun nicht global mit logging.getLogger('') instanziert werden sondern innerhalb der __init__ Methode mit:
    Code:
            self.logger = logging.getLogger(__name__)
    Wobei __name__ ein sogenanntes magic ist. Dies bedeutet, dass python aus __name__ den Namen des Plugins macht. So wird aus plugins/cli/ der Name „plugins.cli“, aus lib/scheduler.py wird „lib.scheduler“
    Daher muss dann in der Konfiguration des Loggings der Name „plugin.cli“ angegeben werden.
    Verwendet man zur Instanziierung einen eigenen Namen wie z.B. self.logger = logging.getLogger(„DWD“) muss in der config auch dieser Name verwendet werden. Ohne plugin.
    Code:
      loggers:
       DWD:
         level: DEBUG
    Auf den Logger kann dann so zugegriffen werden:
    Code:
    self.logger.debug("")
    self.logger.info("")
    Beispiel:
    Code:
     def __init__(self, smarthome, update='False', ip='127.0.0.1', port=2323):
            self.logger = logging.getLogger(__name__)
    
            # Logger verwenden:
            self.logger.debug("Debug Message")

    Grüße
    Christian
    Zuletzt geändert von cmalo; 27.04.2016, 06:17.

    #2
    Klasse! werds gleich mal ausprobieren!

    Klappt gut auf den ersten Blick, endlich Ruhe im -d mode... wobei korrektur: aktuell laufen bei
    Code:
      plugins.eta_pu:
        handlers: [file, console]
        level: INFO
    weiter debugs rein..

    Weitere Frage: logic.xyz würde auch gehen?

    EDIT: Wer lesen kann ist klar im Vorteil...
    Zuletzt geändert von psilo; 17.04.2016, 10:06.

    Kommentar


      #3
      Nach einem Update meines Systems mit "git pull" (developement) erhalte ich die folgende Fehlermeldung direkt auf der Konsole:

      Code:
      Traceback (most recent call last):
        File "/usr/local/smarthome/bin/smarthome.py", line 42, in <module>
          import yaml
      ImportError: No module named 'yaml'
      Gruss Matthias

      Kommentar


        #4
        Ist jetzt halt eine dependency mehr. Müsste zum Image-Bau dazu oder?

        http://stackoverflow.com/questions/1...age-for-python

        Ich verwende kein Image, bei mir wars schon dabei..

        Kommentar


          #5
          Danke für den Hinweis. Mit dem folgenden Befehl konnte ich yaml installieren:

          Code:
          sudo pip install pyyaml
          Gruss Matthias

          Kommentar


            #6
            Zitat von manhartm Beitrag anzeigen
            Mit dem folgenden Befehl konnte ich yaml installieren:
            Code:
            sudo pip install pyyaml
            Danke für den Hinweis. Hab ich oben hinzugefügt.
            Ich werde hier den ersten Post nach und nach erweitern, dann muss ich die Doku nicht gleichzeitig an mehreren Stellen pflegen.
            Falls wünsche oder Fragen zum logging da sind, bitte kurz schreiben.

            Kommentar


              #7
              Hi Christian,

              kurze Info. Auf dem "alten" SH.PY Image von Marcus/Martin klappt es mit dem obengenannten Aufruf nicht. Es mußte bei mir stattdessen
              Code:
              sudo pip-3.2 install pyyaml
              heißen.
              Cheers,
              Oliver

              Kommentar


                #8
                Hallo,

                weis jemand wie ich es anstellen kann, dass mit jedem SH-Neustart ein neues Logfile angelegt wird? also nicht incrementel..

                Gruß Ivan

                Kommentar


                  #9
                  Beim normalen Start(daemon) oder beim -d Parameter?

                  Kommentar


                    #10
                    Hallo Christian,

                    erstmal wärs es für mich im Debug Modus --d angenehm, könnte jedoch auch beim Normalen Start jeweils ein neues Log-File angelegt werden. Erst das 8te File würd dann gelöscht (bei: backupCount: 7)?

                    GRuß Ivan

                    Kommentar


                      #11
                      Wow, ziemlich genial - funzt soweit mal einwandfrei.. Was mir noch nicht ganz klar ist - wo wird denn angegeben, wie das File beim Archivieren heißen soll?

                      Laut Python-Doku gibt es wohl ein rotation_filename Attribut, aber das sehe ich nirgends. Hintergrund der Frage ist, dass ich gerne smarthome-DATUM.log als Dateinamen hätte. Mach ich momentan mit nem Cronjob, aber direkt in Smarthome wäre das feiner..

                      Kommentar


                        #12
                        Hallo!

                        Kann ich damit auch aus einer Logik heraus einen Logger anlegen/ansprechen, bspw. in der Art:

                        Code:
                        #!/usr/bin/env python3
                        logger = logging.getLogger("Alarm")
                        
                        logger.warn("...irgendwas ist passiert...")
                        Später würde ich dann gerne über die Smartvisu nur die Einträge diese Logs ausgeben:
                        Code:
                                     {{ status.log('log1', 'Alarm', 12) }}
                        Geht sowas?

                        Danke und Grüße
                        David

                        Kommentar


                          #13
                          kingolli Geht m.E. nach nicht. Ich nehme daher diverse Instanzen des Operationlog-Plugin, dann kann ich das direkt in den Logiken ansprechen.

                          Kommentar


                            #14
                            Sandman60 Was genau hast du am Operationlog denn geändert, damit es MultiInstanz-fähig ist?
                            Einfach nur ALLOW_MULTIINSTANCE = False auf True gestellt und dann mit instance: blabla im plugin.conf drauf zugegriffen?

                            Das funzt bei mir nämlich nicht... Ich bekomme zum Start die Meldung:
                            Code:
                            2017-03-27  02:23:47 INFO     Main         OperationLog Anwesenheitslogger: logging to file /usr/smarthome/var/log/operationlog/{year:04}-{month:02}-{day:02}-{name}.log, keeping 10 entries in memory, caching active
                            2017-03-27  02:23:47 INFO     Main         OperationLog Nachtlogger: logging to file /usr/smarthome/var/log/operationlog/{year:04}-{month:02}-{day:02}-{name}.log, keeping 20 entries in memory, caching active
                            2017-03-27  02:23:47 INFO     Main         OperationLog ekeylogger: logging to file /usr/smarthome/var/log/operationlog/{year:04}-{month:02}-{day:02}-{name}.log, keeping 50 entries in memory, caching active
                            aber es wird kein Log-File erstellt.

                            Wenn ich das Instancing raus nehme, scheint nur der erste Aufruf des Plugins zu funktionieren.

                            Kommentar


                              #15
                              Onkelandy : Habe nix geändert, die aktuell verwendete Version ist noch ohne MI-Anpassung. Hatte im vorherigen Post zwar den Begriff mehrere instanzen verwendet, meinte aber nicht die MI Fähigkeit. Meinte Mehrfachaufruf in der plugin.conf.
                              Wenn nix geschrieben wird Filerechte prüfen, ggf. leeres Textfile mit den entsprechenden Rechten anlegen.

                              Kommentar

                              Lädt...
                              X