Logging

import logging

logging.debug("Hello world")
logging.info("I just want you to know...")
logging.warning("Someone should look at this")
logging.error("This should not happen")
logging.critical("Something went terribly wrong")

logging.exception("3 Errors walk into a bar. The barman says: Normally I'd Throw you all out, but tonight I'll make an Exception.")

Wenn man den Root-Logger nutzt (wie in diesem Beispiel gezeigt), werden erst Log-Meldung ab Level WARNING ausgegeben.

Die einfachste Möglichkeit, den Root-Logger zu konfigurieren, ist die Funktion logging.config.DictConfig().

import logging.config

LOG_CONFIG = {"version": 1,
              "disable_existing_loggers": False,
              "formatters": {"custom": {"format": "%(asctime)s %(levelname)s %(message)s"}},
              "handlers": {"default": {"class": "logging.StreamHandler",
                                       "formatter": "custom"}},
              "loggers": {"": {"level": "DEBUG",
                               "handlers": ["default"]}}}

logging.config.dictConfig(LOG_CONFIG)

Man beachte, dass der Key für den Root-Logger im Dictionary loggers ein leerer String ist!

Mit logging.handlers.SysLogHandler existiert bereits eine Möglichkeit, die Log-Meldung zu einem Syslog-Daemon weiter zu leiten. Allerdings versucht dieser sich, wenn nicht anderweitig parametrisiert, per UDP zu verbinden, was üblicherweise unter Linux nicht aktiviert ist. Statt dessen gibt es einen Unix-Domain-Socket /dev/log. Glücklicherweise kann man dem Handler beibringen, diesen Socket zu nutzen. Eine Dictionary für die Konfiguration (s.o.) könnte z.B. folgendermaßen aussehen:

LOG_CONFIG = {"version": 1,
              "disable_existing_loggers": False,
              "formatters": {"custom": {"format": "%(message)s"}},
              "handlers": {"syslog": {"class": "logging.handlers.SysLogHandler",
                                      "formatter": "custom",
                                      "address": "/dev/log",
                                      "facility": "daemon"}},
              "loggers": {"": {"level": "DEBUG",
                               "handlers": ["syslog"]}}}

Das Modul logging ist sehr mächtig. Es gibt z.B. einen Logging-Handler, der die Log-Meldungen in eine Datei schreibt und automatisch entsprechend der angegebenen Konfiguration auf dieser ein Log-Rotate ausführt. Auch kann man verschiedene Logger mit unterschiedlichen Handlern parallel verwenden. Die auf dieser Seite gezeigten Beispiele sind nur als Einstieg gedacht, ansonsten wird auf die Modul-Dokumentation verwiesen.

  • Zuletzt geändert: 2023-05-01 08:14