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()
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!
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.