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:
bzw. auf älteren Installationen wie z.B. Raspberry PI mit älterem Python dann alternativ
Die Datei logging.yaml befindet sich bereits vorkonfiguriert in dem Verzeichnis.
Die Datei sieht so aus:
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:
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.
Auf den Logger kann dann so zugegriffen werden:
Beispiel:
Grüße
Christian
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
Code:
sudo pip-3.2 install pyyaml
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]
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__)
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
Code:
self.logger.debug("") self.logger.info("")
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
Kommentar