logging, de 5
loglevels van Python, foutafhandeling in Python en de veelvoorkomende fouttypes
in Python. De laatste secties sturen dezelfde logs en crashes naar LogBrew met
logbrew-sdk 0.1.29. Elk voorbeeld draaide op Python 3.13 en elk outputblok
toont de echte output.
Gebruik voor een Flask-app Flask-logging. Die handleiding
voegt request-traces toe aan dezelfde logging-setup.
Je eerste Python-log schrijven
Sla dit bestand op alsapp.py. Roep logging.basicConfig() één keer aan, op
het startpunt van het programma. Maak in elke module een logger met een naam.
python3 app.py uit. De output gaat naar standard error.
debug-record verschijnt niet, omdat het level INFO is.
logger.exception() logt op ERROR en voegt de traceback toe. Roep het alleen
aan in een except-blok.
Geef waarden mee als argumenten, zoals in "payment retry %d of %d", 2, 3.
Python bouwt het bericht pas op als een handler het record accepteert. Het
berichtsjabloon blijft bij elke nieuwe poging hetzelfde, dus je kunt erop
zoeken.
Loglevels in Python
Een logger verstuurt een record alleen als het level van het record gelijk is aan of hoger is dan het level van de logger. Een handler kan een tweede, hoger level instellen.
De root logger begint op
WARNING. Een nieuwe logger heeft het level NOTSET
(0) en gebruikt het level van de bovenliggende logger. Stel in productie INFO
in. Gebruik DEBUG alleen in ontwikkeling of voor een korte diagnose.
Loggers, handlers en formatters
- Een logger ontvangt de aanroep. Gebruik
logging.getLogger(__name__), zodat de naam van de logger het modulepad volgt. - Een handler stuurt records naar een bestemming, zoals de console, een bestand of LogBrew.
- Een formatter zet een record om in tekst.
logging.NullHandler() toe aan haar eigen logger. De applicatie configureert
handlers en levels één keer. Gebruik logging.config.dictConfig() voor een
grote configuratie.
Foutafhandeling in Python
Vang de meest specifieke exception af die je kunt afhandelen. Gebruikelse
voor code die alleen bij succes draait en finally voor code die altijd draait.
Gebruik raise ... from error om de oorspronkelijke oorzaak te bewaren.
Sla dit bestand op als orders.py.
- Log een exception één keer, op de plek waar je hem afhandelt. Log en raise hem niet opnieuw in elke laag, want elke laag voegt dan een dubbel record toe.
- Schrijf geen
except Exception: pass. Negeer je een fout, log hem dan opWARNINGof hoger, met de reden. - Vang
Exceptionaf en nietBaseException.BaseExceptionvangt ookKeyboardInterruptenSystemExitaf, en die stoppen het programma bewust. - Definieer eigen exceptionklassen voor fouten die aanroepers moeten afhandelen,
zoals
OrderErrordoet.
Meer dan 1 fout melden
Python 3.11 en nieuwer kan eenExceptionGroup raisen. Gebruik die als 1
controle meer dan 1 probleem vindt. Handel elk type af met except*.
Veelvoorkomende fouttypes in Python
Alle ingebouwde fouten die een programma kan afhandelen, erven vanException.
Deze tabel toont de Python-fouten die je het vaakst ziet en de eerste controle
voor elke fout.
KeyboardInterrupt en SystemExit erven van BaseException en niet van
Exception. Het zijn geen fouten in je code.
Python-logs naar LogBrew sturen
LogBrewLoggingHandler is een standaard logging-handler. Hij stuurt elk record
dat hij accepteert naar LogBrew. De console-handler blijft hetzelfde.
1
Maak een projectsleutel
Log in met de CLI. Maak een project en sla de
ingest-sleutel op in een bestand dat alleen de eigenaar kan lezen.De CLI print de sleutel niet. Gebruik in productie de secretmanager van je
platform.
2
Installeer de SDK
Activeer de virtuele omgeving van de applicatie. Installeer daarna het
pakket. Het vereist Python 3.10 of nieuwer.
3
Stel de sleutel en de deploymentidentiteit in
4
Voeg de handler toe
Sla dit bestand op als
worker.py. Roep logging.basicConfig() aan voordat
je de client maakt. De client voegt een handler toe aan de root logger, en
basicConfig() doet niets als de root logger al een handler heeft.HttpTransport() verstuurt events op de achtergrond, 1 seconde na het
eerste event of bij 50 events. client.shutdown() verstuurt de resterende
events en sluit de client.5
Voer het programma uit
extra={...} worden metadata. Het tweede event heeft
exceptionName KeyError en exceptionMessage 'seats'. Maak de handler
met include_exception_text=True om de volledige tekst van de traceback te
versturen.6
Lees de logs terug
Kiezen welke records naar LogBrew gaan
Geef de handler een eigen level om minder records te versturen. De console krijgt nog steedsINFO en hoger.
Python-crashes als issues melden
install_process_error_capture(client) meldt niet-afgevangen exceptions in
scripts, workers, opstartcode en threads. Elke crash wordt 1 issue met het
exceptiontype, het bericht, de stackframes en de gekoppelde oorzaken. Python
print de traceback nog steeds en stopt zoals voorheen.
Sla dit bestand op als startup.py en voer het uit.
FileNotFoundError, het level
critical en het mechanisme python.excepthook. De frames bevatten de
bestandsnaam, de regel en de functie, maar niet het volledige pad. Een crash in
een thread heeft het level error. Voordat Python stopt, wacht de SDK maximaal
2 seconden op de aflevering.
Problemen oplossen
Zie Flask-logging voor webapps. Zie Structured
logging om een logformaat te kiezen. Zie
SDK-integratie voor andere runtimes.
