ProgrammatiePython backend ontwikkelaar

Hoe werkt logging in Python via de logging-module? Welke loggingsniveaus bestaan er en hoe configureer je een logger correct in een multimodule-project? Geef voorbeelden, leg de nuances uit en noem veelvoorkomende fouten.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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()

Lastige vraag.

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!

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp.


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.