Python - Protokollierung

Hallo dort, aufstrebende Python-Programmierer! Heute werden wir in die wunderbare Welt der Protokollierung in Python eintauchen. Als euer freundlicher Nachbar und Computerlehrer freue ich mich, euch auf dieser Reise zu führen. Glaubt mir, am Ende dieses Tutorials werdet ihr wie ein Profi protokollieren!

Python - Logging

Protokollierung in Python

Stellt euch vor, ihr seid ein Detektiv, der eine Geheimnis lösen möchte. Ihr würdet sicherlich alle Spuren, die ihr findet, verfolgen wollen, oder? Genau das macht die Protokollierung in der Programmierung! Sie hilft uns, zu verfolgen, was in unserem Code passiert, während er läuft.

Python kommt mit einem eingebauten logging-Modul, das diesen Prozess zum Kinderspiel macht. Es ist wie ein vertrauenswürdiges Notizbuch, das automatisch wichtige Informationen für dich aufschreibt.

Vorteile der Protokollierung

Jetzt fragt ihr euch vielleicht, "Warum sollte ich mich mit der Protokollierung beschäftigen, wenn ich einfach print-Anweisungen verwenden kann?" Große Frage! Lassen Sie mich eine kleine Geschichte aus meinen frühen Programmierzeiten erzählen.

Ich habe einmal Stunden damit verbracht, ein Programm mit print-Anweisungen zu debuggen. Es war wie suchen nach einer Nadel im Heuhaufen! Damals entdeckte ich die Magie der Protokollierung. Hier sind einige Vorteile:

  1. Flexibilität: Im Gegensatz zu print-Anweisungen können Protokolle leicht ein- und ausgeschaltet werden, ohne den Code zu verändern.
  2. Schweregradstufen: Ihr könnt eure Protokolle basierend auf ihrer Wichtigkeit kategorisieren.
  3. Ausgabekontrolle: Protokolle können auf Dateien, Konsole oder sogar Remote-Server geleitet werden!
  4. Leistung: Die Protokollierung hat einen geringeren Einfluss auf die Leistung im Vergleich zu print-Anweisungen.

Komponenten der Python-Protokollierung

Lassen Sie uns die Hauptkomponenten der Python-Protokollierung aufteilen:

  1. Logger: Diese sind die Eingangspunkte in das Protokolliersystem.
  2. Handler: Diese senden die Protokolldaten an die entsprechende Destination.
  3. Formatter: Diese legen das Layout der Protokolldaten in der endgültigen Ausgabe fest.
  4. Filter: Diese bieten zusätzliche Kontrolle darüber, welche Protokolldaten ausgegeben werden.

Stellt euch das wie eine Montagelinie in einer Fabrik vor. Der Logger ist der Arbeiter, der Probleme erkennt, der Handler entscheidet, wohin die Meldung gesendet wird, der Formatter entscheidet, wie die Meldung aussehen soll, und der Filter entscheidet, welche Meldungen wichtig genug sind, um weitergeleitet zu werden.

Protokollstufen

Die Python-Protokollierung kommt mit fünf Standardstufen der Schwere. Sehen wir uns diese in einer praktischen Tabelle an:

Stufe Numerischer Wert Beschreibung
DEBUG 10 Detaillierte Informationen, typischerweise nur bei der Diagnose von Problemen von Interesse.
INFO 20 Bestätigung, dass alles wie erwartet funktioniert.
WARNING 30 Ein Hinweis darauf, dass etwas Unerwartetes passiert ist oder ein Problem in der näheren Zukunft anzeigt.
ERROR 40 Aufgrund eines ernsthaften Problems konnte die Software eine Funktion nicht ausführen.
CRITICAL 50 Ein schwerwiegendes Fehler, der darauf hinweist, dass das Programm selbst möglicherweise nicht weiterlaufen kann.

Einfaches Protokollbeispiel

Beginnen wir mit einem einfachen Beispiel, um uns die Füße zu wärmen:

import logging

# Grundlegende Protokollierung konfigurieren
logging.basicConfig(level=logging.INFO)

# Einen Logger erstellen
logger = logging.getLogger(__name__)

# Einige Nachrichten protokollieren
logger.debug("Dies ist eine Debug-Nachricht")
logger.info("Dies ist eine Info-Nachricht")
logger.warning("Dies ist eine Warnung")
logger.error("Dies ist ein Fehler")
logger.critical("Dies ist eine kritische Nachricht")

Wenn ihr diesen Code ausführt, seht ihr eine ähnliche Ausgabe wie diese:

INFO:__main__:Dies ist eine Info-Nachricht
WARNING:__main__:Dies ist eine Warnung
ERROR:__main__:Dies ist ein Fehler
CRITICAL:__main__:Dies ist eine kritische Nachricht

Habt ihr bemerkt, dass die DEBUG-Nachricht nicht erscheint? Das liegt daran, dass wir die grundlegende Konfigurationsstufe auf INFO gesetzt haben. Alles unter INFO (wie DEBUG) wird nicht protokolliert, unless wir die Konfiguration ändern.

Protokollierung konfigurieren

Jetzt machen wir unsere Protokollierung etwas schicker:

import logging

# Protokollierung konfigurieren
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='app.log'
)

logger = logging.getLogger(__name__)

logger.debug("Debug-Nachricht")
logger.info("Info-Nachricht")
logger.warning("Warnung")
logger.error("Fehler")
logger.critical("Kritische Nachricht")

In diesem Beispiel haben wir:

  1. Den Protokollierungslevel auf DEBUG gesetzt
  2. Ein Format für unsere Protokollnachrichten angegeben
  3. Die Ausgabe in eine Datei namens 'app.log' geleitet

Wenn ihr die Datei 'app.log' überprüft, seht ihr schön formatierte Protokollnachrichten mit Zeitstempeln!

Protokollhandler

Handler sind wie die Postdienste der Protokollwelt. Sie bestimmen, wohin eure Protokollnachrichten gehen. Sehen wir uns ein Beispiel mit mehreren Handlers an:

import logging

# Einen Logger erstellen
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Handler erstellen
c_handler = logging.StreamHandler()  # Konsole-Handler
f_handler = logging.FileHandler('file.log')  # Datei-Handler
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# Formate erstellen und zu Handler hinzufügen
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# Handler zum Logger hinzufügen
logger.addHandler(c_handler)
logger.addHandler(f_handler)

# Den Logger testen
logger.debug('Dies ist eine Debug-Nachricht')
logger.info('Dies ist eine Info-Nachricht')
logger.warning('Dies ist eine Warnung')
logger.error('Dies ist ein Fehler')
logger.critical('Dies ist eine kritische Nachricht')

In diesem Beispiel haben wir zwei Handler eingerichtet:

  1. Ein StreamHandler, der WARNING und darüber auf die Konsole ausgibt
  2. Ein FileHandler, der ERROR und darüber in eine Datei protokolliert

Führt diesen Code aus, und ihr werdet WARNING und darüber in eurer Konsole sehen, während nur ERROR- und CRITICAL-Nachrichten in die Datei gespeichert werden.

Und so, meine Freunde, habt ihr eure ersten Schritte in die Welt der Python-Protokollierung gemacht. Denkt daran, Übung macht den Meister. Versucht, mit verschiedenen Konfigurationen herumzuspielen und seht, was für eure Projekte am besten funktioniert.

Fröhliches Protokollieren, und möge euer Code immer frei von Fehlern sein!

Credits: Image by storyset