Wir haben bisher Ausgaben unserer Programme mit print()
im Terminal ausgegeben. Sinnvoller ist es aber vielfach, die Ausgaben in eine Datei zu schreiben, wo wir sie später,z.B. zur Fehleranalyse abrufen können. Ebenso gibt es Ausgaben, die wir während der Programmierarbeit brauchen, aber im späteren produktiven Umfeld nicht mehr. Das kommt dann das Logging ins Spiel. Damit führt Python ein Protokoll, in dem wir verfolgen können, welcher Programmzustand zu einem Fehler geführt hat. Vielleicht wäre es sinnvoller gewesen, dieses Kapitel vor Netzwerk zu ziehen, du kannst das selber anpassen, wenn du möchtest.
Logging des Raspberry Pi
Auch dein Raspberry Pi (genaugenommen das Betriebssystem und die Anwendungen) schreiben Informationen in Logdateien. Bei Raspberry Pi OS liegen diese standardmässig im Verzeichnis /var/log

Die wichtigste Logdatei bei Linuxsystemen ist /var/log/syslog
, in diese Datei werden alle wichtigen Ereignisse des Bertriebssystems seit dem Start hineingeschrieben. Da in den Logdateien u.U. informationen stehen könnten, die bösen Menschen verraten, wie sie deinem Rechner schaden können, sind Logdateien üblicherweise nur von root
lesbar.
Python Logging Framework
Zum Logging setzt man üblicherweise Frameworks ein, die eine für alle Programmierer verbindliche Funktionalität zur Verfügung stellt. Python bringt dafür das logging
Modul mit
LogLevel
Es gibt üblicherweise verschiedene Stufen von Log-Ausgaben, die unterschiedliche Einsatzzwecke haben.
Loglevel | Beschreibung |
---|---|
DEBUG | Ausgaben, die die die Programmentwicklung unterstützen. Werden im produktiven Betrieb üblicherweise abgeschaltet. |
INFO | informelle Ausgaben |
WARNING | Warnungen |
ERROR | Fehlerzustände |
FATAL | schwerwiegende Fehler |
Die Level beinhalten immer alle höher liegenden Level. DEBUG loggt auch INFO, WARNING, ERROR und FATAL. Dahingehend werden bei ERROR nur die Loglevel ERROR und FATAL geloggt, die anderen
Beispiel
Jetzt zeig ich dir, wie du in Python loggen kannst. Zunächst packen wir den Loglevel in eine eigene Datei, in der er je nach Einsatzzweck ohne viel Suchen angepasst werden kann.
import logging
__LOGLEVEL__ = logging.DEBUG
Das folgende kleine Programm zeigt dir die verschiedenen Stufen des Loggins.
import logging
from conf import __LOGLEVEL__
logging.basicConfig( format='%(asctime)s [%(levelname)s] %(funcName)s: %(message)s',
# filename='test.log',
level=__LOGLEVEL__)
def testlogging():
print('testlogging() aufgerufen.')
logging.debug('DEBUG/Druckdaten werden gesendet.')
logging.info('INFO/Es werden 2 Seiten gedruckt')
logging.warning('WARN/nicht genügend Papier im Drucker')
logging.error('ERROR/Drucker nicht gefunden.')
logging.critical('CRITICAL/Drucker brennt')
if __name__ == '__main__':
testlogging()
Nach dem import des logging Moduls wird mit
logging.basicConfig( format='%(asctime)s [%(levelname)s] %(funcName)s: %(message)s',
# filename='test.log',
level=__LOGLEVEL__)
das Logging konfiguriert.Zunächst definieren wir das Format, in dem jede Nachricht in einer Logzeile haben soll. Jede Zeile beginnt mit dem Zeitstempel (asctime), danach folgt in eckigen Klammern der Loglevel (levelname)
der Nachricht und vor dem Doppelpunkt vor dem eigentlichen Text (message)
noch der Name der Funktion (funcname)
, aus der heraus die Logzeile geschrieben wurde. Wie dein Logfile aussieht, bleibt völlig dir überlassen. Es ist aber Usus, jede Zeile mit dem Datumseintrag zu beginnen. Das hier verwendete Format deckt die meisten Anwendungsfälle, wie das Filtern nach Loglevel und Methodennamen und das Sortieren nach Datum ab, deshalb setze ich es gerne ein.
Dann kannst du noch einen Dateinamen für dein Logfile angeben. Wenn dieser fehlt, wird in die Console geloggt. Zu guter Letzt, gibst du noch den Loglevel an.

Der Loglevel wird in diesem Beispiel in einer eigenen Datei gesetzt, um ihn in den unterschiedlichen Umgebungen (Entwicklung, Test, Produktion) leichter anpassen zu können.
Datenschutz
Das Logfile ist eine Art der elektronischen Datenspeicherung und unterliegt damit der DSGVO und allen anderen Datenschutzregelungen. Du solltest daher niemals personenbezogene Daten ins Logfile speichern, da dann die Gefahr besteht, dass nicht autorisierte Personen (z.B. Admins und auch du), diese einsehen können.
Ein anderer Tipp: Logfiles können mitunter schnell sehr groß werden und den freien Platz auf dem Speichermedium auffressen. Du solltest dir eine Strategie überlegen, wie du veraltete Logfiles löschen kannst (bspw. mit logrotate)
Im nächsten Teil wird es etwas Raspi spezifischer, wenn wir die GPIO Pins ansteuern.
Dieses Kapitel bildet nur das einfache Logging mit der basicConfig ab. Sehr viel mehr Möglichkeiten hast du mit dem logging.config Modul.