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:
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