De logging-module is de standaardtool in Python voor logboekregistratie. Het implementeert een hiërarchie van loggers en ondersteunt loggingsniveaus (severity levels): DEBUG, INFO, WARNING, ERROR, CRITICAL. Correct gebruik stelt je in staat om centraal het uitvoerbeheer te regelen, logs naar bestanden op te slaan, ze per e-mail te verzenden, te filteren op niveau, enzovoort.
Het belangrijkste idee is om loggers met namen (logging.getLogger(__name__)) in elk module te maken, en geen globale root-logger vanaf nul in elke module te creëren. Configuratie (indeling, handlers, niveau) gebeurt centraal bij het starten van de applicatie.
Voorbeeld van configuratie:
import logging logging.basicConfig(format='%(levelname)s:%(name)s:%(message)s', level=logging.INFO) logger = logging.getLogger(__name__) def foo(): logger.info('Informatief bericht') logger.error('Fout!') foo()
Waarom mag je logging.basicConfig() niet in elk module aanroepen? Wat gebeurt er als je dat doet?
Antwoord: logging.basicConfig() configureert de root-logger maar één keer per Python-sessie. Herhaalde aanroepen, als de root-logger al is geïnitialiseerd, worden genegeerd. Daardoor, als verschillende modules basicConfig() proberen aan te roepen met hun eigen indelingen/niveaus, zal alleen de allereerste werken!
Verhaal
In een groot project configureerde elke ontwikkelaar logging naar eigen smaak via basicConfig en lokale handlers. Hierdoor werden sommige logs helemaal niet weergegeven, andere werden 10 keer gedupliceerd, en berichten van verschillende modules pasten niet in één bestand.
Verhaal
Bij de migratie van een webservice naar meerlagige logging vergaten ze de loggernaam via getLogger(__name__) op te geven, en schreven ze overal naar de root-logger. Uiteindelijk was het onmogelijk om te bepalen waar een specifieke log vandaan kwam.
Verhaal
Ze gebruikten de functie logger.error() voor het registreren van alle berichten, zelfs niet-foute. Als gevolg daarvan “verhieven” automatische bewakingssystemen voortdurend alarmsignalen, omdat ze een hoog niveau van fouten zagen, terwijl het gewoon debug/informatieve berichten waren.