Logging
Log-Level
1 2 3 4 5 6 7 8 9 |
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.
Konfiguration
Die einfachste Möglichkeit, den Root-Logger zu konfigurieren, ist die Funktion logging.config.DictConfig()
.
1 2 3 4 5 6 7 8 9 10 11 |
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!
Syslog
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:
1 2 3 4 5 6 7 8 9 |
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" ]}}} |
Weitere Möglichkeiten
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.