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

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
    • Pro: Updates während derLaufzeit.
    • 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.

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
  • 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 ::.
  • 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

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 Formatter

Wie gehört was zusammen?

Logger -> Handler -> Formatter

Logger Flow

Fragen?

Quellen:

-http://pymotw.com/2/logging/ -https://docs.python.org/2/library/logging.html#logrecord-attributes -https://docs.python.org/2/howto/logging.html -http://docs.python-guide.org/en/latest/writing/logging/ -https://docs.python.org/2/images/loggingflow.png -http://2.bp.blogspot.com/-leSV7wGIIoU/TyxxkDOkesI/AAAAAAAACSI/y2P5lOVcOTg/s1600/logging_main_classes.png