ProgrammierungPython Backend-Entwickler

Wie funktioniert das Logging in Python über das Modul logging? Welche Logging-Ebenen gibt es und wie konfiguriert man einen Logger richtig in einem mehrmodularen Projekt? Geben Sie Beispiele, erklären Sie Feinheiten und häufige Fehler.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

Das Modul logging ist das Standardtool von Python für das Führen von Logs. Es implementiert eine Hierarchie von Loggern und unterstützt Logging-Ebenen (severity levels): DEBUG, INFO, WARNING, ERROR, CRITICAL. Die richtige Nutzung ermöglicht eine zentrale Verwaltung der Ausgaben, das Speichern von Logs in Dateien, das Versenden per E-Mail, das Filtern nach Ebene usw.

Die Hauptidee ist, Logger mit Namen (logging.getLogger(__name__)) in jedem Modul zu erstellen, anstatt einen globalen Root-Logger in jedem Ort neu zu erstellen. Die Konfiguration (Format, Handler, Ebene) erfolgt zentral zu Beginn der Anwendung.

Beispiel für die Konfiguration:

import logging logging.basicConfig(format='%(levelname)s:%(name)s:%(message)s', level=logging.INFO) logger = logging.getLogger(__name__) def foo(): logger.info('Informationsnachricht') logger.error('Fehler!') foo()

Trickfrage.

Warum kann man logging.basicConfig() nicht in jedem Modul aufrufen? Was passiert, wenn man das tut?

Antwort: logging.basicConfig() konfiguriert den Root-Logger nur einmal pro Python-Sitzung. Wiederholte Aufrufe, wenn der Root-Logger bereits initialisiert wurde, werden ignoriert. Infolgedessen, wenn verschiedene Module versuchen, basicConfig() mit ihren eigenen Formaten/Ebenen aufzurufen, wird nur der erste funktionieren!

Beispiele realer Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


Geschichte

In einem großen Projekt hat jeder Entwickler das Logging nach seinem Geschmack über basicConfig und lokale Handler konfiguriert. Dadurch wurden einige Logs überhaupt nicht ausgegeben, andere wurden zehnfach dupliziert, und Nachrichten verschiedener Module passten nicht in eine Datei.


Geschichte

Bei der Migration eines Webdienstes zu mehrstufigem Logging wurde vergessen, den Logger-Namen über getLogger(__name__) anzugeben, überall wurde in den Root-Logger geschrieben. Dadurch war es unmöglich festzustellen, woher ein bestimmter Log kam.


Geschichte

Die Funktion logger.error() wurde verwendet, um alle Nachrichten, sogar fehlerfreie, zu protokollieren. Infolgedessen haben automatische Überwachungssysteme ständig „Alarm“ geschlagen, weil sie ein hohes Fehlerniveau sahen, obwohl es sich nur um Debug-/Informationsnachrichten handelte.