Top

Logging

Das Modul der Standard Bibliothek ist vollständig und einfach zu benutzen.

import logging

logging.info("info log")

Die folgende Log Level werden unterstützt, WARNING ist der Standardwert:
DEBUG, INFO, WARNING, ERROR, CRITICAL

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logging.info("info log")

Um in eine Datei service.log zu schreiben, gibt man diese bei der Konfiguration mit an.

import logging

logging.basicConfig(filename='service.log', level=logging.DEBUG)

logging.debug('This message should go to the log file')

Das Logging konfiguriert man mit dem Hinzufügen von Handler und Formatter.

import logging

handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
root = logging.getLogger()
root.setLevel(logging.INFO)
root.addHandler(handler)

logging.info("info log")

Es gibt drei Wege das Logging zu konfigurieren, als Python Code, als Konfigurationsdatei oder als Konfigurations Dict.

import logging
import logging.config

logging.config.fileConfig('logging.conf')

logging.info("info log")

Eine logging.conf Datei könnte die folgende Form haben.

[loggers]
keys=root

[handlers]
keys=console_handler

[formatters]
keys=simple_formatter

[logger_root]
level=DEBUG
handlers=console_handler

[handler_console_handler]
class=StreamHandler
level=DEBUG
formatter=simple_formatter
args=(sys.stderr,)

[formatter_simple_formatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

Mit dictConfig() kann man JSON oder YAML verwenden und es zu einem Dict konvertieren.

import logging
import logging.config

logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'default': {'format': '%(asctime)s - %(levelname)s - %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S'}
    },
    'handlers': {
        'stdout': {
            'class': 'logging.StreamHandler',
            'formatter': 'default',
            'stream': 'ext://sys.stdout'
        },
    },
    'loggers': {
        '': {
            'level': 'INFO',
            'handlers': ['stdout']
        }
    }    
})

logging.info("info log")

Handler

Der StreamHandler nutzt sys.stderr wenn nichts weiteres angegeben ist.

Der FileHandler definiert eine Datei in die geschrieben wird.

Der NullHandler hat keine Formatierung oder eine Ausgabe, kann verwendet werden um Bibliotheken zu schreiben.

Der RotatingFileHandler definiert die Größe und Anzahl der Log Dateien. Hier haben die Log Dateien eine Größe von 500 bytes und wir behalten 3 Backups (service.log.n).

import logging.handlers as handlers

logHandler = handlers.RotatingFileHandler('service.log', maxBytes=500, backupCount=3)

Der TimedRotatingFileHandler definiert wann eine neue Datei erstellt wird, hier jede Stunde.

import logging.handlers as handlers

logHandler = handlers.TimedRotatingFileHandler('service.log', when='H', interval=1, backupCount=5)

Es gibt noch mehr Handler die zum Beispiel Log Einträge als HTTP an einen Server senden.