Logger / Logging Florian Pfingstag 12.05.2015 Was sind Logger? Logger sind . . . • eine Methode, um Events oder Nachrichten zu dokumentieren. • ein Weg die “Print” Funktion zu umgehen. • Logger dokumentieren generell in einer Logfile. • Logger werden unterschieden zwischen: – Diagnostic-Logging – Audit Logging Beispiel für eine Logfile: 2015-05-10 20:54:05,933 DEBUG: Debug Message in example_output.py 2015-05-10 20:54:05,933 INFO: Info Message in example_output.py 2015-05-10 20:54:05,933 WARNING: Warning Message in example_output.py 2015-05-10 20:54:05,933 ERROR: Error Message in example_output.py 2015-05-10 20:54:05,934 CRITICAL: Failed in example_output.py Traceback (most recent call last): File "example_output.py", line 15, in <module> 100 / 0 ZeroDivisionError: integer division or modulo by zero 1 Logger vs. Print • Die Print Funktion produziert möglicherweise ungewollt Output. • Die Print Funktionen für Debugging müssen vor der Auslieferung entfernt werden. • Ein Logger kann einfach leise gestellt werden. • Ein Logger kann unterschiedlich ausgegeben werden (Datei, std.out, per E-Mail). Wann also was verwenden? • Print nur für primitiven Command-Line Output verwenden ! • Logger sind besser geeignet für: – Events, die während der normalen Laufzeit eintreten. – auftretende Warnungen während der Laufzeit. – unterdrückte Fehler, die nicht zum Stop führen. • Bei Fehlern, die zum Stop führen, sollten Exceptions beibehalten werden. Logger in Python Logger haben folgende Level: • critical - 50 • error - 40 • warning - 30 • info - 20 • debug -10 Jeder Logger zeigt nur Meldungen seines Levels und darüber. Es gibt drei Wege zur Konfiguration: • INI-Datei 2 – Pro: Updates während der Laufzeit (über Sockets). – Kontra: weniger Kontrolle über den Logger (subclassed Filter/Logger) • DICT oder JSON Format – Pro: Ist durch JSON Modul von einer Datei importierbar. – Kontra: Ebenfalls weniger Kontrolle über den Logger. • fest codiert – Pro: komplette Kontrolle über den Logger. – Kontra: Sourcecode muss eventuell verändert werden. Beispiele zu INI, JSON, YAML Ein Beispiel für festcodierte Logger: Standard Name des Loggers ist dann root. >>> import logging >>> logging.basicConfig(level=logging.LEVEL, #Basis Konfiguration filename='LOGGING_OUT', #Standard ist sys.stdout format='FORMAT') #Standard: Level, Name Log Einträge erstellt man durch den Aufruf: logging.info("MESSAGE") #Produziert log auf level "info" mit MESSAGE Handler Handler bestimmen das Ausgabemedium. • • • • • Stream Handler -> für sys.stdout, stderr o.ä. File Handler -> für Senden an eine Datei Rotating File Handler -> für mehrere Dateien ( auch Timed ) Socket Handler -> senden an Netzwerk SMTP Handler -> senden per Mail 3 • HTTP Handler -> senden an Web Server Weitere Handler Ein Logger kann mehrere Handler haben. Einen eigenen Logger erstellt man durch: import logging import logging.handlers LOGGING_OUT = 'rotating_file.log' my_logger = logging.getLogger('MyLogger') my_logger.setLevel(logging.DEBUG) Rotating File Handler um bei mehreren Aufrufen eine neue Datei zu erstellen: rf_handler = logging.handlers.RotatingFileHandler(LOGGING_OUT, \ maxBytes=20, backupCount=3) my_logger.addHandler(rf_handler) my_logger.debug('test') Mehr zu Handlern Formatierung der Logger Formatter bestimmen das Format der Ausgabe. • Standard Format in Python ist – < level>:< LoggerN ame>:< N achricht>. • Formatter werden auf die Handler angewandt. • Ein Handler kann nur ein Format haben. • Standard Web-Log Format ist das Common Log Format: – IP, user-identifier, user id, date+time+timezone, client_request, HTTP status, size of object 4 Logger im Format Time, Level, Message, Path erstellt man durch: import logging from logging import Formatter my_logger = logging.getLogger('MyLogger') formatter = logging.Formatter('%(asctime)s %(levelname)s:\ %(message)s in %(pathname)s') file_handler = logging.FileHandler('formatted_log') file_handler.setLevel(logging.INFO) file_handler.setFormatter(formatter) my_logger.addHandler(file_handler) my_logger.error('message') Mehr zu Formattern Wie gehört was zusammen? Logger -> Handler -> Formatter Logger Flow Fragen? Quellen: • • • • • • • Victor Lin’s good logging practice Python module of the week Python Dokumentation Logger Python Dokumentation HowTo Hitchhikers Guide to logging in Python Logger-Flow Bild Logger Bild 5