Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by haas.homelinux.net...

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 21 Debugging
  Pfeil 21.1 Der Debugger
  Pfeil 21.2 Inspizieren von Instanzen – inspect
    Pfeil 21.2.1 Datentypen, Attribute und Methoden
    Pfeil 21.2.2 Quellcode
    Pfeil 21.2.3 Klassen und Funktionen
  Pfeil 21.3 Formatierte Ausgabe von Instanzen – pprint
  Pfeil 21.4 Logdateien – logging
    Pfeil 21.4.1 Das Meldungsformat anpassen
    Pfeil 21.4.2 Logging Handler
  Pfeil 21.5 Automatisiertes Testen
    Pfeil 21.5.1 Testfälle in Docstrings – doctest
    Pfeil 21.5.2 Unit Tests – unittest
  Pfeil 21.6 Traceback-Objekte – traceback
  Pfeil 21.7 Analyse des Laufzeitverhaltens
    Pfeil 21.7.1 Laufzeitmessung – timeit
    Pfeil 21.7.2 Profiling – cProfile
    Pfeil 21.7.3 Tracing – trace


Galileo Computing - Zum Seitenanfang

21.4 Logdateien – logging  Zur nächsten ÜberschriftZur vorigen Überschrift

Das Modul logging stellt ein flexibles Interface zum Protokollieren eines Programmlaufs bereit. Protokolliert wird der Programmablauf, indem an unterschiedlichen Stellen im Programm Meldungen an das logging-Modul abgesetzt werden. Diese Meldungen können unterschiedliche Dringlichkeitsstufen haben. So gibt es beispielsweise Fehlermeldungen, Warnungen oder Informationen. Das Modul logging kann diese Meldungen auf vielfältige Weise verarbeiten. Üblich ist es, die Meldung mit einem Timestamp zu versehen und entweder auf dem Bildschirm auszugeben oder in eine Datei zu schreiben.

In diesem Kapitel soll die Verwendung des Moduls logging anhand mehrerer Beispiele im interaktiven Modus gezeigt werden. Um die Beispielprogramme korrekt ausführen zu können, muss zuvor das Modul logging eingebunden sein:

>>> import logging

Bevor Meldungen an den sogenannten Logger geschickt werden können, muss dieser durch Aufruf der Funktion basicConfig initialisiert werden. Die Funktion basicConfig bekommt verschiedene Schlüsselwortparameter übergeben. Im folgenden Beispiel wird ein Logger eingerichtet, der alle eingehenden Meldungen in die Logdatei programm.log schreibt:

>>> logging.basicConfig( 
...     filename = "programm.log", 
...     filemode = "a")

Über den Schlüsselwortparameter filemode kann der Modus angegeben werden, in dem die Logdatei geöffnet werden soll. Eine Liste aller verfügbaren Modi und ihrer Bedeutung finden Sie in Abschnitt 9.3.4. Der Parameter ist mit "a" für »append« vorbelegt und könnte hier auch weggelassen werden.

Jetzt können mithilfe der im Modul enthaltenen Funktion log Meldungen an den Logger übergeben werden. Die Funktion log bekommt dabei die Dringlichkeitsstufe der Meldung als ersten und die Meldung selbst in Form eines Strings als zweiten Parameter übergeben:

>>> logging.log(logging.ERROR, "Ein Fehler ist aufgetreten") 
>>> logging.log(logging.INFO, "Dies ist eine Information")

Durch das Aufrufen der Funktion shutdown wird der Logger korrekt deinitialisiert, und eventuell noch anstehende Schreiboperationen werden durchgeführt:

>>> logging.shutdown()

Natürlich sind nicht nur die Dringlichkeitsstufen ERROR und INFO verfügbar. Die folgende Tabelle listet alle vordefinierten Stufen auf, aus denen Sie wählen können. Die Tabelle ist dabei nach Dringlichkeit geordnet, wobei die dringendste Stufe zuletzt aufgeführt wird.


Tabelle 21.2  Vordefinierte Dringlichkeitsstufen
Level Beschreibung

loggin.DEBUG

Eine Meldung, die nur für den Programmierer zur Fehlersuche interessant ist

loggin.INFO

Eine Informationsmeldung über den Programmstatus

loggin.WARNING

Eine Warnmeldung, die auf einen möglichen Fehler hinweist

loggin.ERROR

Eine Fehlermeldung, nach der das Programm weiterarbeiten kann

loggin.CRITICAL

Eine Meldung über einen kritischen Fehler, der das sofortige Beenden des Programms oder der aktuell durchgeführten Operation zur Folge hat


Beachten Sie, dass aus Gründen des Komforts zu jeder Dringlichkeitsstufe eine eigene Funktion existiert. So sind die beiden Funktionsaufrufe von logging.log aus dem letzten Beispiel äquivalent zu:

logging.error("Ein Fehler ist aufgetreten") 
logging.info("Dies ist eine Information")

Wenn Sie sich die Logdatei nach dem Aufruf dieser beiden Funktionen ansehen, werden Sie feststellen, dass es lediglich einen einzigen Eintrag gibt:

ERROR:root:Ein Fehler ist aufgetreten

Das liegt daran, dass der Logger in seiner Basiskonfiguration nur Meldungen loggt, deren Dringlichkeit größer oder gleich der einer Warnung sind. Um auch Debug- und Info-Meldungen mitzuloggen, muss beim Aufruf der Funktion basicConfig im Schlüsselwortparameter level ein geeigneter Wert übergeben werden:

logging.basicConfig( 
    filename="programm.log", 
    level = logging.DEBUG) 
logging.error("Ein Fehler ist aufgetreten") 
logging.info("Dies ist eine Information")

In diesem Beispiel wurde die Mindestdringlichkeit auf DEBUG gesetzt. Das bedeutet, dass alle Meldungen, die mindestens eine Dringlichkeit von DEBUG haben, geloggt werden. Folglich erscheinen auch beide Meldungen in der Logdatei:

ERROR:root:Ein Fehler ist aufgetreten 
INFO:root:Dies ist eine Information

Galileo Computing - Zum Seitenanfang

21.4.1 Das Meldungsformat anpassen  Zur nächsten ÜberschriftZur vorigen Überschrift

Zu Beginn von Abschnitt 21.4 wurde erwähnt, dass man Einträge in einer Logdatei gerne mit der Uhrzeit versieht, zu der die Meldung eingegangen ist. Eine solche Uhrzeit wird aber, wie in den vorangegangenen Beispielen zu sehen war, standardmäßig nicht angezeigt. Es gibt allerdings eine Möglichkeit, das Format der geloggten Meldung anzupassen. Dazu muss beim Funktionsaufruf von basicConfig der Schlüsselwortparameter format übergeben werden:

logging.basicConfig( 
    filename="programm.log", 
    level = logging.DEBUG, 
    format = "%(asctime)s [%(levelname)-8s] %(message)s") 
logging.error("Ein Fehler ist aufgetreten") 
logging.info("Dies ist eine Information") 
logging.error("Und schon wieder ein Fehler")

Sie sehen, dass ein Format-String übergeben wurde, der die Vorlage für eine Meldung enthält, wie sie später in der Logdatei stehen soll. Beachten Sie, dass es sich dabei um die bekannte String-Formatierung handelt, bei der die Bezeichner asctime für den Timestamp, levelname für die Dringlichkeitsstufe und message für die Meldung verwendet wurden. Die von diesem Beispiel generierten Meldungen sehen folgendermaßen aus:

2007-09-27 03:28:55,811 [ERROR   ] Ein Fehler ist aufgetreten 
2007-09-27 03:29:00,690 [INFO    ] Dies ist eine Information 
2007-09-27 03:29:12,686 [ERROR   ] Und schon wieder ein Fehler

Die folgende Tabelle listet die wichtigsten Bezeichner auf, die innerhalb des format-Formatstrings verwendet werden dürfen. Beachten Sie, dass einige der Bezeichner je nach Kontext, in dem die Meldung erzeugt wird, keine Bedeutung haben.


Tabelle 21.3  Bezeichner im Formatstring
Level Beschreibung
%(levelname)s

Die Dringlichkeitsstufe der Meldung

%(pathname)s

Der Pfad zur Programmdatei, in der die Meldung abgesetzt wurde

%(filename)s

Der Dateiname der Programmdatei, in der die Meldung abgesetzt wurde

%(module)s

Der Name des Moduls, in dem die Meldung abgesetzt wurde. Der Modulname entspricht dem Dateinamen ohne Dateiendung.

%(funcName)s

Der Name der Funktion, in der die Meldung abgesetzt wurde

%(lineno)s

Die Quellcodezeile, in der die Meldung abgesetzt wurde

%(asctime)s

Zeitpunkt der Meldung. Beachten Sie, dass das Datums- und Zeitformat beim Funktionsaufruf von basicConfig über den Parameter datefmt angegeben werden kann. Näheres dazu folgt im Anschluss an diese Tabelle.

%(thread)s

Die ID des Threads, in dem die Meldung abgesetzt wurde

%(process)s

Die ID des Prozesses, in dem die Meldung abgesetzt wurde

%(message)s

Der Text der Meldung


Was uns an diesen Meldungen vielleicht noch stört, ist das Format des Timestamps. Zum einen wird das amerikanische Datumsformat verwendet, und zum anderen ist eine Auflösung bis auf die Millisekunde genau für unsere Zwecke ein bisschen zu fein. Das Format des Timestamps kann beim Aufruf von basicConfig über den Schlüsselwortparameter datefmt angegeben werden:

logging.basicConfig( 
    filename="programm.log", 
    level = logging.DEBUG, 
    format = "%(asctime)s %(levelname)s: %(message)s", 
    datefmt = "%d.%m.%Y %H:%M:%S") 
logging.error("Ein Fehler ist aufgetreten")

Die in der Vorlage für das Datumsformat verwendeten Platzhalter wurden in Abschnitt 16.1 eingeführt. Die von diesem Beispiel erzeugte Meldung sieht folgendermaßen aus:

27.09.2007 03:38:49 ERROR: Ein Fehler ist aufgetreten

Galileo Computing - Zum Seitenanfang

21.4.2 Logging Handler  topZur vorigen Überschrift

Bisher wurde ausschließlich besprochen, wie das Modul logging dazu verwendet werden kann, alle eingehenden Meldungen in eine Datei zu schreiben. Tatsächlich ist das Modul in dieser Beziehung sehr flexibel und erlaubt es, nicht nur in Dateien, sondern beispielsweise auch in Streams zu schreiben oder die Meldungen über eine Netzwerkverbindung zu schicken. Dafür werden sogenannte Logging Handler verwendet. Um genau zu sein, haben wir in den vorherigen Abschnitten bereits einen impliziten Handler verwendet, ohne uns darüber im Klaren zu sein.

Um einen speziellen Handler einzurichten, muss eine Instanz der Handler-Klasse erzeugt werden. Diese kann dann vom Logger verwendet werden. Im folgenden Beispiel sollen alle Meldungen auf einen Stream, nämlich sys.stdout, geschrieben werden. Dazu wird die Handler-Klasse logging.StreamHandler verwendet.

import logging 
import sys
handler = logging.StreamHandler(sys.stdout) frm = logging.Formatter("%(asctime)s %(levelname)s: %(message)s", "%d.%m.%Y %H:%M:%S") handler.setFormatter(frm)
logger = logging.getLogger() logger.addHandler(handler) logger.setLevel(logging.DEBUG)
logger.critical("Ein wirklich kritischer Fehler") logger.warning("Und eine Warnung hinterher") logger.info("Dies hingegen ist nur eine Info")

Zunächst wird der Handler, in diesem Fall ein StreamHandler, instanziiert. Im nächsten Schritt wird eine Instanz der Klasse Formatter erzeugt. Diese Klasse kapselt die Formatierungsanweisungen, die wir in den vorherigen Beispielen beim Aufruf der Funktion basicConfig übergeben haben. Mithilfe der Methode set Formatter werden dem Handler die Formatierungsanweisungen bekannt gegeben.

Um den Handler beim Logger zu registrieren, benötigen wir Zugriff auf die bisher implizit verwendete Logger-Instanz. Diesen Zugriff erlangen wir über die Funktion logging.getLogger. Danach wird über addHandler der Handler hinzugefügt und über setLevel die gewünschte Dringlichkeitsstufe eingestellt.

Beachten Sie, dass die Meldungen im Folgenden nicht über Funktionen des Moduls logging, sondern über die Methoden critical, warning und info der Logger-Instanz logger abgesetzt werden. Das Beispielprogramm gibt folgenden Text auf dem Bildschirm aus:

27.09.2007 17:21:46 CRITICAL: Ein wirklich kritischer Fehler 
27.09.2007 17:21:46 WARNING: Und eine Warnung hinterher 
27.09.2007 17:21:46 INFO: Dies hingegen ist nur eine Info

Im Folgenden sollen die wichtigsten zusätzlichen Handler-Klassen beschrieben werden, die im Modul logging enthalten sind.

logging.FileHandler(filename[, mode)

Dieser Handler schreibt die Logeinträge in die Datei filename. Dabei wird die Datei im Modus mode geöffnet. Beachten Sie, dass der Handler FileHandler auch implizit durch Angabe der Schlüsselwortparameter filename und filemode beim Aufruf der Funktion basicConfig verwendet werden kann.

logging.StreamHandler([stream])

Dieser Handler schreibt die Logeinträge in den Stream stream. Beachten Sie, dass der Handler StreamHandler auch implizit durch Angabe des Schlüsselwortparameters stream beim Aufruf der Funktion basicConfig verwendet werden kann.

logging.handler.SocketHandler(host, port)

Dieser Handler sendet die Logeinträge über eine TCP-Netzwerkschnittstelle an den Rechner mit dem Hostnamen host unter Verwendung des Ports port. Beachten Sie, dass die Meldungen komprimiert werden und der Rechner, der die Logeinträge entgegennimmt, diese speziell entpacken muss. Aus Platzgründen werden wir darauf hier nicht eingehen, Sie finden aber ein ausführliches Beispielprogramm in der Dokumentation des Moduls logging unter dem Stichwort »Sending and receiving events across a network«.

logging.handler.DatagramHandler(host, port)

Dieser Handler sendet die Logeinträge über eine UDP-Netzwerkschnittstelle und wird ähnlich verwendet wie der Handler SocketHandler.

logging.handler.SMTPHandler(mailhost, fromaddr, toaddr, subject)

Dieser Handler sendet die Logeinträge als E-Mail an die Adresse toaddr. Dabei wird subject als Betreff und fromaddr als Absenderadresse eingetragen. Über den Parameter mailhost wird der zu verwendende SMTP-Server angegeben.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo