NB_02_Logging_Werkzeuge¶
(c) 2024 Technische Hochschule Augsburg - Fakultät für Informatik - Prof.Dr.Nik Klever - Impressum
Logging¶
Das Modul logging bietet ein komplettes und flexibles Logging-System. Am einfachsten werden Log-Meldungen an eine Datei oder an sys.stderr (wie im folgenden Beispiel) gesendet:
import logging
logging.debug('Debugging-Informationen')
logging.info('Informationsmeldung')
logging.warning('Warnung: Konfigurationsdatei% s nicht gefunden', 'server.conf')
logging.error ('Fehler aufgetreten')
logging.critical ('Kritischer Fehler - das Programm wird heruntergefahren')
WARNING:root:Warnung: Konfigurationsdateiserver.conf nicht gefunden ERROR:root:Fehler aufgetreten CRITICAL:root:Kritischer Fehler - das Programm wird heruntergefahren
Logging in eine Datei mit unterschiedlichem Format¶
%%writefile meinebib.py
# meinebib.py
import logging
def tue_etwas(args=None):
logging.debug('Tue etwas mit dem Argument {}'.format(args))
if not args:
logging.critical('Kein Argument übergeben !')
Overwriting meinebib.py
%%writefile meineAnwendung.py
import logging
import meinebib
def logbsp(level):
logging.basicConfig(filename='meineAnwendung.log',
format='%(levelname)s Fehler um %(asctime)s in %(funcName)s Zeile %(lineno)s: %(message)s',
datefmt='%H:%M:%S',
level=level)
logging.warning('Start')
meinebib.tue_etwas(level)
meinebib.tue_etwas()
logging.info('Ende')
if __name__ == '__main__':
logbsp(logging.DEBUG)
Writing meineAnwendung.py
!python meineAnwendung.py
with open("meineAnwendung.log","r") as f:
print(f.read())
WARNING Fehler um 11:23:58 in logbsp Zeile 9: Start DEBUG Fehler um 11:23:58 in tue_etwas Zeile 5: Tue etwas mit dem Argument 10 DEBUG Fehler um 11:23:58 in tue_etwas Zeile 5: Tue etwas mit dem Argument None CRITICAL Fehler um 11:23:58 in tue_etwas Zeile 7: Kein Argument übergeben ! INFO Fehler um 11:23:58 in logbsp Zeile 12: Ende
Standardmäßig werden Informations- und Debugging-Nachrichten unterdrückt und die Ausgabe wird an sys.stderr gesendet. Neue Filter können verschiedene Ausgaben basierend auf der Nachrichtenpriorität auswählen: DEBUG, INFO, WARNING, ERROR und CRITICAL.
Das Logging-System kann direkt aus Python konfiguriert werden aber auch über eine benutzerdefinierte Konfigurationsdatei um ein maßgeschneidertes Logging durchzuführen, ohne den Programmcode der Anwendung zu verändern.
%%Mooc MoocCheckboxesAssessment
Logging
Es ist der folgende Code gegeben:
import logging
logging.basicConfig(level=logging.info)
logging.debug('Debugging-Informationen')
logging.info('Informationsmeldung')
logging.warning('Warnung: Konfigurationsdatei% s nicht gefunden', 'server.conf')
logging.error('Fehler aufgetreten')
logging.critical('Kritischer Fehler - das Programm wird heruntergefahren')
Welche Logging Nachrichten werden angezeigt ?
Schwache Referenzen (Weak References)¶
Python ermöglicht eine automatische Speicherverwaltung (über einen Referenzzähler für die meisten Objekte und eine Garbage Collection zur Beseitigung von Zyklen). Der entsprechende Memorybereich wird kurz nach der letzten Referenz auf ihn freigegeben.
Dieser Ansatz funktioniert für die meisten Anwendungen gut, aber gelegentlich ist es notwendig, Objekte nur solange zu verfolgen, solange sie von etwas anderem benutzt werden. Leider erzeugt die Verfolgung eines Objekts selbst eine Referenz, die sie permanent macht. Das Modul weakref bietet daher Werkzeuge für die Verfolgung von Objekten, ohne eine Referenz zu erstellen. Wenn das Objekt nicht mehr benötigt wird, wird es automatisch aus einer weakref Tabelle entfernt und ein Callback-Aufruf wird für die weakref Objekte ausgelöst. Typische Anwendungen sind insbesondere das Cachen von Objekten, deren Erstellung in der Regel aufwändig ist:
%%writefile weakref_test.py
import weakref, gc
class A:
def __init__(self, value):
self.value = value
def __repr__(self):
return str(self.value)
a = A(10) # Erzeugen einer Referenz
d = weakref.WeakValueDictionary()
d['primary'] = a # dies erzeugt keine Referenz, sondern eine schwache Referenz
print(d['primary']) # holen des Objekts wenn es noch vorhanden ist
del a # lösche die Referenz
print(gc.collect()) # Aufruf der Garbage Collection
print(d['primary']) # der Eintrag als schwache Referenz wurde damit automatisch gelöscht
Overwriting weakref_test.py
!python weakref_test.py
10 0 Traceback (most recent call last): File "weakref_test.py", line 14, in <module> print(d['primary']) # der Eintrag als schwache Referenz wurde damit automatisch gelöscht File "/home/nik/anaconda3/lib/python3.6/weakref.py", line 137, in __getitem__ o = self.data[key]() KeyError: 'primary'
%%Mooc Video
Weitere Literatur¶
%%Mooc WebReference
Brief Tour of the Standard Library - Part II
https://docs.python.org/3/tutorial/stdlib2.html
Hinweis: Kurze Auflistung weiterer Module aus der Standardbibliothek
%%Mooc WebReference
logging — Logging facility for Python
https://docs.python.org/3/library/logging.html
Hinweis: logging - Protokollierungs- und Logging Werkzeuge für Python