Logging in Python

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.

1Python Programmierkurs
2Python: Methoden
3Kontrollstrukturen
4Strings in Python
5Container
6Objekte in Python
7Module
8Exceptions in Python
9Typkonvertierung
10Python und Dateien
11Datum und Zeit mit Python verarbeiten
12Multithreading
13Netzwerk in Python
14Logging in Python
15GPIO
16Automatische Tests
17Datenbanken mit Python
18Python: Generatoren und List Comprehension
19Python: Webseiten mit Flask
20Python virtuelle Umgebungen
21Interrupts & Signale
22NumPy
23Matplotlib
24match

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

Logging Dateien unter /var/log (Ausschnitt)
Logging Dateien unter /var/log (Ausschnitt)

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.

LoglevelBeschreibung
DEBUGAusgaben, die die die Programmentwicklung unterstützen. Werden im produktiven Betrieb üblicherweise abgeschaltet.
INFOinformelle Ausgaben
WARNINGWarnungen
ERRORFehlerzustände
FATALschwerwiegende 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 Nachrichtin 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.

Logging Ausgabe des Testprogramms
Logging Ausgabe des Testprogramms

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.

Schreibe einen Kommentar

Cookie Consent Banner von Real Cookie Banner