Logging mit Micropython

Micropython Logging

Micropython biete ein kleines Logging Framework, welches ein Subset des CPython Logging Frameworks implementiert.

Zur Zeit kann man damit aber nur Logger anlegen, ihre Levels einstellen und auf die Konsole loggen. Für ein Projekt benötigte ich aber einen RotatingFileHandler.

Es gibt offene Pullrequests für Micropython, welche genau das vor haben, bzw. gute Grundlagen dafür liefern:

  1. logging: Improve the logging module. #507
  2. python-stdlib/logging: add formatter, handlers #482

Beide sind nicht gemerged und nicht fertig.

Schliesslich wurde ich im Pycopy Projekt fündig, bzw. in der Library Sammlung dazu. Hier gibt es eine wesentlich mächtigere logging Implementation, welche direkt unter Micropython läuft. Einzig bei der Installation mit upip müssen ein paar Abhängigkeiten nachträglich gelöscht werden.

Pycopy logging in Micropython installieren

>>> import upip
>>> upip.install('pycopy-logging')
Installing to: /Users/ernst/.micropython/lib/
Warning: micropython.org SSL certificate is not validated
Installing pycopy-logging 0.7.5 from https://files.pythonhosted.org/packages/07/2b/380b0db9e18ec7a37d0cca211ba9edde3d31c67e76d8df76847a8c86d694/pycopy-logging-0.7.5.tar.gz
Installing pycopy-os 1.1.3 from https://files.pythonhosted.org/packages/45/1d/e0cd14fbe9a746d9971bdac179d7be1bba91f25af26abd54e6f557b8733b/pycopy-os-1.1.3.tar.gz
Installing pycopy-errno 0.1.4 from https://files.pythonhosted.org/packages/ab/7c/a0d03cb169f37dc9a9de9fd40376d6f8a781b29768c45cb22158edb11985/pycopy-errno-0.1.4.tar.gz
Installing pycopy-os.path 0.2.8 from https://files.pythonhosted.org/packages/31/ee/d9ad507eeb2b25f6ac6340e02b953a57523248dee9c96a5837b31d2e8e9c/pycopy-os.path-0.2.8.tar.gz
Installing pycopy-stat 0.5.1 from https://files.pythonhosted.org/packages/65/95/ff904fce737681df1e6bda82c7618f1212a285b9650c73547af5757440cf/pycopy-stat-0.5.1.tar.gz
Installing pycopy-uos2 0.5.6 from https://files.pythonhosted.org/packages/ef/1b/f178f71d0e592eb17704ed28eebe5eb86c8882cd6a2c58028783df7e2b27/pycopy-uos2-0.5.6.tar.gz
Installing pycopy-ffilib 0.2.1 from https://files.pythonhosted.org/packages/60/d3/5f63d48a0699515eaafc01750bcc8ae926da8fd84ba2c8ab0561ea4aac55/pycopy-ffilib-0.2.1.tar.gz

Wie man sieht, werden neben logging noch ein paar weitere Abhängigkeiten installiert. Diese laufen unter Micropython nicht, bzw. überlagern bereits vorhandene Module. Deshalb gehen wir ins angegebene Installationsverzeichnis und löschen diese von Hand wieder.

[519] : cd .micropython/lib/
[520] : l
total 152
-rw-r--r--  1 ernst  staff    22B 22 Sep 17:50 @PaxHeader
-rw-r--r--  1 ernst  staff    35K 20 Sep 09:56 LICENSE
-rw-r--r--  1 ernst  staff   1,3K 22 Sep 17:50 errno.py
-rw-r--r--  1 ernst  staff   1,1K 22 Sep 17:50 ffilib.py
drwxr-xr-x  4 ernst  staff   128B 22 Sep 15:55 logging
drwxr-xr-x  4 ernst  staff   128B 22 Sep 17:50 os
-rw-r--r--  1 ernst  staff   4,2K 22 Sep 17:50 stat.py
-rw-r--r--  1 ernst  staff   5,6K 22 Sep 17:50 uos2.py
[521] : rm -rf errno.py ffilib.py os/ stat.py uos2.py
[522] : l
total 104
-rw-r--r--  1 ernst  staff    22B 22 Sep 17:50 @PaxHeader
-rw-r--r--  1 ernst  staff    35K 20 Sep 09:56 LICENSE
drwxr-xr-x  4 ernst  staff   128B 22 Sep 15:55 logging
[523] :

Jetzt ist das Logging Framwork von Pycopy unter Micropython für Unix/OSX einsatzbereit.

>>> import logging
>>> from logging.handlers import RotatingFileHandler
>>> myLogger = logging.getLogger('myLogger')
>>> myLogger.addHandler(RotatingFileHandler('myloggfile.log', 1000, 3))
>>> myLogger.setLevel(logging.DEBUG)
>>> for i in range(0,20):
...myLogger.warning('01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789')
...
[511] : l
total 32
-rw-r--r--    1 ernst  staff   444B 22 Sep 17:01 myloggfile.log
-rw-r--r--    1 ernst  staff   999B 22 Sep 17:01 myloggfile.log.1
-rw-r--r--    1 ernst  staff   999B 22 Sep 17:01 myloggfile.log.2
-rw-r--r--    1 ernst  staff   999B 22 Sep 16:36 myloggfile.log.3
[512] : cat myloggfile.log
01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
[513] :

Logging auf einem Raspberry Pi Pico

Das Logging Modul von Pycopy verwendet im StreamHandler ein flush() Kommando welches in der Raspberry Pi Pico Version nicht untersützt ist. Der Fix ist zum Glück einfach, wir können den Code einfach entfernen. D.h. in der Datei .micropython/lib/init.py müssen die letzten 4 Zeilen aus dem StreamHandler gelöscht werden.

class StreamHandler(Handler):
    def __init__(self, stream=None):
        super().__init__()
        self._stream = stream or sys.stderr
        self.terminator = "\n"

    def emit(self, record):
        self._stream.write(self.formatter.format(record) + self.terminator)
        self.flush()            # loeschen
                                # loeschen
    def flush(self):            # loeschen
        self._stream.flush()    # loeschen

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert