Logging Handler

Zusätzlich zu den Logging Handlern, die im Standard Logging Modul von Python definiert, bringt SmartHomeNG weitere Handler mit, die bei der Konfiguration in ../etc/logging.yaml verwendet werden können.


ShngTimedRotatingFileHandler

Der ShngTimedRotatingFileHandler ist eine Variante des TimedRotatingFileHandler, der im Python Logging Modul vorhanden ist (logging.handlers.TimedRotatingFileHandler).

Der TimedRotatingFileHandler benennt die Backup Versionen einer Log Datei in einer Art und Weise um, die im Handling umständlich sein kann, da die Datei dabei die normale Extension .log verliert:

smarthome-warnings.log –> smarthome-warnings.log.2021-04-06

Der ShngTimedRotatingFileHandler hat die gleiche Funktionalität und Konfigurierbarkeit wie der TimedRotatingFileHandler, bildet den Namen für die Backup Dateien jedoch anders. Der Timestamp (2021-04-06) wird nicht an das Ende des Dateinamens angefügt, sondern vor der Extension .log eingefügt:

smarthome-warnings.log –> smarthome-warnings.2021-04-06.log

Dadurch bleibt die normale Extension des Dateinamens erhalten und die Dateien können z.B. durch Doppel-Klick in der GUI eines Betriebssystems geöffnet werden.

Benutzung des Handlers

In der Datei ../etc/logging.yaml wird der Handler als Ersatz für TimedRotatingFileHandler eingesetzt. Dort wo im Abschnitt handler: bisher der Handler TimedRotatingFileHandler konfiguriert ist:

handler:
    shng_warnings_file:
        class: logging.handlers.TimedRotatingFileHandler
        formatter: shng_simple
        level: WARNING
        utc: false
        when: midnight
        backupCount: 7
        filename: ./var/log/smarthome-warnings.log
        encoding: utf8

wird anstelle des class: Attributes der Handler ShngTimedRotatingFileHandler folgendermaßen konfiguriert:

handler:
    shng_warnings_file:
        (): lib.log.ShngTimedRotatingFileHandler
        formatter: shng_simple
        level: WARNING
        utc: false
        when: midnight
        backupCount: 7
        filename: ./var/log/smarthome-warnings.log
        encoding: utf8

DateTimeRotatingFileHandler

Dieser Handler ermöglicht wie das operationlog und datalog Plugin, die Logdateien entsprechend der aktuellen Uhrzeit zu benennen. Gleich wie beim oben beschriebenen ShngTimedRotatingFileHandler kann angegeben werden, in welchem zeitlichen Abstand eine neue Datei erstellt werden soll und wieviele Backup-Versionen erhalten bleiben. Der Handler stellt mehrere Platzhalter für Dateinamen und Ordner zur Verfügung. Monat, Tag, Stunde und Minute werden im Normalfall mit einer Ziffer ohne vorgestellter 0 geschrieben, außer man setzt dezidiert ein :02 hinten dran. Durch {month:02} wird z.B. der März als 03 geschrieben, während der März bei {month} als 3 geschrieben wird.

  • {year}: Das aktuelle Jahr im Format YYYY, z.B. 2023

  • {month}: Der aktuelle Monat im Format (M)M, z.B. (0)3 für März oder 10 für Oktober

  • {day}: Der aktuelle Tag im Format (D)D, z.B. (0)1 für den 1. oder 10 für den 10. des Monats

  • {hour}: Die aktuelle Stunde im Format (H)H, z.B. 22 für zehn Uhr abends oder (0)1 für ein Uhr nachts

  • {minute}: Die aktuelle Minute im Format , z.B. 22 für zehn Uhr abends oder 1 für ein Uhr nachts

  • {stamp}: Der aktuelle Unix Timestamp, z.B. 1699220771.133886

  • {intstamp}: Der aktuelle Unix Timestamp als Integer, z.B. 1699220771

Das folgende Beispiel erstellt eine CSV Datei mit Namen „test“ und dem aktuellen Datum im Format Tag.Monat.Jahr_Stunde im Ordner smarthome/<aktuelles Jahr>. Jede volle Stunde wird eine neue Logdatei mit dem gleichen Muster erstellt. Es werden zwei Backup-Dateien behalten, ältere Dateien werden zur vollen Stunde gelöscht.

Hinweis: Ist {hour} nicht Bestandteil des Dateinamens, wird die selbe Datei für den jeweiligen Tag überschrieben, erst am nächsten Tag wird eine neue Datei erstellt.

handler:
    csv_file:
        (): lib.log.DateTimeRotatingFileHandler
        formatter: shng_simple
        filename: ./{year}/test_{day}.{month}.{year}_{hour}.csv
        when: 'H'
        interval: 1
        backupCount: 2

Wird beim Anlegen des Handlers kein Platzhalter im Dateinamen genutzt, kommt die standardmäßige Benennung, bei der zwischen Dateinamen und Dateierweiterung die aktuelle minimale Zeitinformation eingefügt wird, zu tragen.

Das folgende Beispiel erstellt im Log-Ordner alle 10 Minuten eine Datei namens test.<Jahr>-<Monat>-<Tag>-<Stunde>.<Minute>.txt. Wird die Logrotation auf „jeden xten Tag“ gestellt, also when: 'D', wird die Datei test.<Jahr>-<Monat>-<Tag>.txt benannt.

handler:
    txt_file:
        (): lib.log.DateTimeRotatingFileHandler
        formatter: shng_simple
        filename: ./var/log/test.txt
        when: 'M'
        interval: 10

ShngMemLogHandler

In SmartHomeNG ist seit je her standardmäßig ein Memory Log konfiguriert. Dieses Memory Log ist bisher völlig losgelöst vom Python Logging System. Das memory Log trägt den Namen ‚env.core.log‘ und wird dazu verwendet in der smartVISU auf der Konfigurationsseite unter ‚SmartHomeNG‘ Log Einträge anzuzeigen. Das Memory Log ‚env.core.log‘ kann auch mit Hilfe des cli Plugins angezeigt werden.

Weitere Memory Logs (die bisher mit dem memlog Plugin angelegt werden konnten/mussten) können in der smartVISU mit Hilfe der Widgets status.log und des cli Plugins angezeigt werden.

Mit Hilfe des ShngMemLogHandler können nun normale Log Einträge, die über das Standard Python Logging erzeugt werden, in ein Memory Log geloggt werden. Der ShngMemLogHandler legt dazu ein entsprechendes Memory Log an und der Handler wird in den konfigurierten Loggern als (zusätzlicher) Logger konfiguriert.

Benutzung des Handlers

In der Datei ../etc/logging.yaml wird der ShngMemLogHandler im Abschnitt handler: konfiguriert.

handler:
    memory_heizung:
        (): lib.log.ShngMemLogHandler
        logname: mem_heiz
        maxlen: 60
        level: INFO
        cache: True

ShngMemLogHandler hat vier Parameter:

  • logname: - Legt den Namen fest, unter dem das Memory Log aus der smartVISU oder dem cli Plugin angesprochen werden kann.

  • maxlen: - Legt fest, wie viele Einträge ein Memory Log aufnehmen kann, bevor der älteste Eintrag gelöscht wird.

  • level: - Legt den minimalen Log Level fest, der in das Memory Log geschrieben wird

  • cache: - Ist dieser Parameter True, werden die Einträge im cache Ordner gesichert und beim Neustart geladen


Um den Handler im Python Logging zu nutzen, wird es anschließend der Handler zum gewünschten Logger hinzu gefügt.

loggers:
    heizung:
        handlers: [shng_heizung_file, memory_heizung]