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:

In [2]:
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

In [3]:
%%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
In [4]:
%%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
In [5]:
!python meineAnwendung.py
In [6]:
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.

In [7]:
%%Mooc MoocCheckboxesAssessment
Out[7]:

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 ?

logging.debug
logging.info
logging.warning
logging.error
logging.critical

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:

In [8]:
%%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
In [9]:
!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'
In [10]:
%%Mooc Video
Out[10]:

Weitere Literatur

In [11]:
%%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

In [12]:
%%Mooc WebReference

logging — Logging facility for Python

https://docs.python.org/3/library/logging.html

Hinweis: logging - Protokollierungs- und Logging Werkzeuge für Python