Hallo zusammen,
ich habe eine Frage, wie ich das mit mehreren Loggern geschickt lösen kann. Alle meine Logiken loggen in die Standardausgabe [shng_details_file]. Das soll auch so bleiben. Weiterhin habe ich aber die ein oder andere Ausgabe auch in die VISU geloggt und hierzu memLog genutzt. Das ist aber deprecated und kann mit standard Mechanismen gelöst werden. Soweit so gut.
Ich habe mir nun einen Logger angelegt in der logging.yaml
Ich habe hier bewusst nicht logics.<meineLogik> in die logging.yaml unter loggers eingetragen, da das Standard Logging ja weiterlaufen soll und ich nur bestimmte Logeinträge in das messagesystem eintragen möchte.
In der Logik kann ich dann selbst entscheiden, ob ich in den Standard Logfile loggen möchte oder in das Messagesystem, welches in der VISU angezeigt wird
Standard
Messagesystem
Soweit so gut!
Nun aber zur eigentlichen Frage:
Das Logging will ich gern über eine Funktion machen, die nicht Bestandteil dieser Phyton Logik ist. Hintergrund ist, dass ich noch ein paar Formatierungen vornehmen will, die immer gleich sind und dann einfach aus jeder Logik immer die gleiche Funktion aufrufen kann. Dazu habe ich ein Python Skript mit den Funktionen, welches ich dann einfach in jede Logik per import einbinde. So muss ich nur an einer Stelle ändern.
modMessageSystem.py
Logik.py
Leider kennt modMessageSystem.py das Objekt "logging" nicht und kann so auch das messagesystem nicht ermitteln. Natürlich kann ich das übergeben, aber das wollte ich eigentlich nicht. Wenn ich das richtig gesehen habe, ist das ja eigentlich auch nicht mehr notwendig.
https://github.com/smarthomeNG/smart...42ef7c71a719c9
Wie wäre aus eurer Sicht eine gute Implementierung?
Vermutlich denke ich schon wieder viel zu kompliziert.
Mein Wunsch wäre es aus dem modMessageSystem.py einfach in den richtigen Log schreiben zu können (hier in den messagesystem).
System
+ PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
+ NAME="Debian GNU/Linux"
+ VERSION_ID="12"
+ VERSION="12 (bookworm)"
+ VERSION_CODENAME=bookworm
+ SmartHomeNG Version:v1.10.0-master (4b25822a0)
+ SmartHomeNG Plugins Version:v1.10.0-master (7e00e4ee)
+ Python Version:3.10.12 final (virtual environment)
+ Virtuelle Umgebung wie in der Dokumentation mit 3.10.12 eingerichtet
ich habe eine Frage, wie ich das mit mehreren Loggern geschickt lösen kann. Alle meine Logiken loggen in die Standardausgabe [shng_details_file]. Das soll auch so bleiben. Weiterhin habe ich aber die ein oder andere Ausgabe auch in die VISU geloggt und hierzu memLog genutzt. Das ist aber deprecated und kann mit standard Mechanismen gelöst werden. Soweit so gut.
Ich habe mir nun einen Logger angelegt in der logging.yaml
Code:
handlers: handler_messagesystem: (): lib.log.ShngMemLogHandler logname: messagesystem maxlen: 60 level: INFO cache: True loggers: messagesystem: handlers: [handler_messagesystem] level: INFO
In der Logik kann ich dann selbst entscheiden, ob ich in den Standard Logfile loggen möchte oder in das Messagesystem, welches in der VISU angezeigt wird
Standard
Code:
logger.info('Meldung in den Standardlogfile')
Code:
mylogger = logging.getLogger("messagesystem") mylogger.info('Meldung in das Messagesystem (dargestellt in der VISU)')
Soweit so gut!
Nun aber zur eigentlichen Frage:
Das Logging will ich gern über eine Funktion machen, die nicht Bestandteil dieser Phyton Logik ist. Hintergrund ist, dass ich noch ein paar Formatierungen vornehmen will, die immer gleich sind und dann einfach aus jeder Logik immer die gleiche Funktion aufrufen kann. Dazu habe ich ein Python Skript mit den Funktionen, welches ich dann einfach in jede Logik per import einbinde. So muss ich nur an einer Stelle ändern.
modMessageSystem.py
Code:
#!/usr/bin/env python def logMessage(msgclass, textmessage): messagesystemlogger = logging.getLogger("messagesystem") # Meldeklasse prüfen und ggf. anpassen # weitere Anpassungen # ... if msgclass == 'ERROR': messagesystemlogger.error(textmessage) elif ((msgclass == 'WARNING') or (msgclass == 'WARN')): messagesystemlogger.warn(textmessage) elif msgclass == 'INFO': messagesystemlogger.info(textmessage) else: messagesystemlogger.error(textmessage)
Logik.py
Code:
#!/usr/bin/env python import logics.modMessageSystem as msg logger.info('Meldung in den Standardlogfile') msg.logMessage('INFO', 'Meldung in das Messagesystem (dargestellt in der VISU)')
Leider kennt modMessageSystem.py das Objekt "logging" nicht und kann so auch das messagesystem nicht ermitteln. Natürlich kann ich das übergeben, aber das wollte ich eigentlich nicht. Wenn ich das richtig gesehen habe, ist das ja eigentlich auch nicht mehr notwendig.
https://github.com/smarthomeNG/smart...42ef7c71a719c9
Wie wäre aus eurer Sicht eine gute Implementierung?
Vermutlich denke ich schon wieder viel zu kompliziert.
Mein Wunsch wäre es aus dem modMessageSystem.py einfach in den richtigen Log schreiben zu können (hier in den messagesystem).
System
+ PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
+ NAME="Debian GNU/Linux"
+ VERSION_ID="12"
+ VERSION="12 (bookworm)"
+ VERSION_CODENAME=bookworm
+ SmartHomeNG Version:v1.10.0-master (4b25822a0)
+ SmartHomeNG Plugins Version:v1.10.0-master (7e00e4ee)
+ Python Version:3.10.12 final (virtual environment)
+ Virtuelle Umgebung wie in der Dokumentation mit 3.10.12 eingerichtet
Kommentar