Kapitel 21
Fehler finden und vermeiden
592
21.6.2 Logger-Objekte
Bei großen Projekten mit vielen Modulen ist es sinnvoll, mehrere Logger zu verwenden.
Ihnen können unterschiedliche Logging-Levels zugeordnet werden.
Mit der Funktion
getLogger() erzeugen Sie ein neues Logger-Objekt. Format eines Auf-
rufs:
Dabei ist
name eine Zeichenkette mit dem Namen des Loggers. Dieser Name kann ein
Modul bezeichnen oder eine Funktionalität, die getestet wird. Der Name kann auch im Log-
Eintrag auftauchen. So können die Meldungen unterschiedlicher Logger in der Log-Datei
erkannt werden und so auf die Stelle im Programm geschlossen werden, wo eine Meldung
abgesetzt worden ist.
Jeden Logger können Sie mit der Logger-Methode
setLevel() auf ein individuelles Log-
ging-Level setzen. Beispiel:
Erläuterung:
#1: Hier wird festgelegt, dass alle Meldungen über die Standardausgabe ausgegeben wer-
den. Die Meldungen werden also nicht in einer Datei gespeichert, sondern erscheinen im
Shell-Fenster.
#2: Diese Meldung wird unterdrückt, da der Logger auf Level INFO gesetzt worden ist.
Das Programm führt zu folgender Ausgabe auf dem Bildschirm:
21.6.3 Das Format der Logging-Meldungen konfigurieren
Schauen Sie sich noch einmal die Log-Einträge aus dem vorigen Abschnitt an. Sie sind nach
folgendem voreingestellten Format aufgebaut:
Level:Name des Loggers:Meldung
Dieses Format können Sie abändern. Vielleicht möchten Sie, dass ein Log-Eintrag auch eine
Zeitangabe enthält. Dann müssen Sie beim Aufruf von
logging.basicConfig() das
Schlüsselwortargument
format=formatstring spezifizieren. Dabei ist formatstring eine
Zeichenkette, die eine Schablone mit Platzhaltern für die Log-Einträge definiert. Die Platz-
getLogger(name)
# log_test_1.py
import logging, sys
logging.basicConfig(file=sys.stdout) #1
log = logging.getLogger("Modul 1")
log.setLevel(logging.INFO)
log.debug("nicht so wichtig") #2
log.info("wichtig")
INFO:Modul 1:wichtig
593
21.6
Vertiefung: Professionelles Arbeiten mit Logging
halter beginnen jeweils mit % und enden mit einem Buchstaben, der den Datentyp des für
den Platzhalter einzusetzenden Wertes bestimmt (z.B.
s für einen String oder d für eine
Dezimalzahl). Tabelle 21.2 beschreibt einige wichtige Platzhalter.
Im folgenden Skript enthält die Meldung den Zeitpunkt ihrer Entstehung – auf die Tau-
sendstelsekunde genau.
Skript:
Meldung:
Im zweiten Beispiel enthalten die Log-Einträge eine genaue Angabe, an welcher Stelle des
Programmtextes der Eintrag in die Datei geschrieben wurde.
Skript:
Platzhalter Bedeutung
%(asctime)s
Zeitpunkt, zu dem die Meldung abgesetzt wurde
%(filename)s
Dateiname des Python-Moduls, in dem die Meldung abgesetzt worden ist
%(funcName)s
Name der Funktion, in der die Meldung abgesetzt worden ist
%(levelname)s
Logging-Level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
%(lineno)d
Nummer der Zeile, in der die Meldung abgesetzt wurde
%(message)s
Text der Meldung
%(module)s
Name des Moduls, in dem die Meldung abgesetzt worden ist
%(name)s
Name des Loggers
%(pathname)s
Vollständiger Pfad des Python-Moduls, in dem die Meldung abgesetzt wor-
den ist
Tabelle 21.2: Platzhalter für den Formatierungsstring der Logging-Konfiguration (Auswahl)
import logging
logging.basicConfig(filename="/tmp/logging.txt",
format='%(asctime)s -> %(message)s')
logging.critical("Wassereinbruch in Laufwerk E")
2009-11-07 09:01:55,775 -> Wassereinbruch in Laufwerk E
#log_test_3.py
import logging
logging.basicConfig(filename="/tmp/logging.txt",
level=logging.DEBUG,
format='%(module)s, Zeile %(lineno)d: %(message)s')
for i in range(4):
logging.debug("Meldung {}.".format(i))

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.