13. Application and trace logging
Date: 2026-02-02
Status
Proposed
Context
Voor het kunnen beheren, bewaken en analyseren van de MOZa‑diensten maken we onderscheid tussen:
- Interne trace logging: trace‑ en flow‑informatie binnen onze eigen componenten en services voor performance‑analyse, oorzaak/gevolg, en doorstroom‑/latency‑inzichten.
- LDV keten‑tracering (over diensten/organisaties heen): trace‑informatie die gebruikt wordt om een verzoek over meerdere diensten/organisaties heen te volgen (ketenoverzicht voor derden/ketenpartners).
- Applicatie logging (event/operational logs), voor functionele en technische gebeurtenissen binnen een component.
We hebben besloten de LDV‑standaard te gebruiken voor het uitwisselen en opslaan van keten‑trace‑data (over services/organisaties heen). Tegelijk willen we eenduidige afspraken voor applicatie logging vastleggen zodat logs betrouwbaar, AVG‑veilig en goed doorzoekbaar zijn.
Gerichte eisen vanuit team/veld:
- Elke log moet uniek zijn.
- Houd de log regels stabiel en beheersbaar.
- Log geen lijsten/arrays.
- Concateneer geen strings.
- Log geen gebruikersdata.
- Duidelijke semantiek van log niveaus: Error/Warning/Info/Debug.
Decision
-
Interne trace logging
- Doel: inzicht in performance, doorlooptijden, wachttijden, foutpaden en oorzaak‑/gevolg binnen MOZa‑componenten.
- Wanneer: Hoeft niet standaard, maar kan worden toegevoegd als nodig.
- Bereik: uitsluitend intern gebruik; niet bedoeld voor ketenpartners.
- Privacy/Personally Identifiable data (PII): geen persoonsgegevens in trace‑attributen; beperk attributen tot technische/operationele waarden.
-
LDV keten‑tracering (over diensten/organisaties)
- De distributie/uitwisseling van keten‑trace‑gegevens gebeurt via LDV conform ADR 0010. LDV is leidend voor het verzamelen en analyseren van trace‑gegevens over service‑ en organisatiegrenzen heen.
- Wanneer: Standaard toegepast voor API endpoints
- Gebruik: bedoeld voor ketenoverzicht en voor derden/ketenpartners om een verzoek door de keten te volgen.
- Privacy/PII: geen persoonsgegevens in trace‑attributen; functionele identifiers die herleidbaar zijn tot personen worden niet gelogd.
-
Applicatie logging
- Formaat: gestructureerde logging (JSON) met vaste velden:
timestamp, level, message, properties (key‑value).
- Uniekheid: iedere logregel is identificeerbaar via combinatie van
timestamp + bron + optionele eventId.
- Geen lijsten/arrays: log primitives en korte key‑value properties; grote collecties niet loggen.
- Geen string‑concatenatie:
- Gebruik message templates met placeholders:
"Bestand {fileName} verwerkt in {durationMs} ms".
- Geen gebruikersdata (PII):
- Log nooit namen, adressen, BSN, e‑mail, telefoonnummers, vrije invoer, of andere PII. Gebruik gehashte/gepseudonimiseerde technische id's indien noodzakelijk en goedgekeurd.
- Niveaus en semantiek:
- Error – een fout/exception: functionaliteit is mislukt of niet hersteld; bevat een exception object en een duidelijke oorzaak.
- Warning – iets is misgegaan of afwijkend, maar niet direct kritisch; de workflow kan doorgaan of is automatisch hersteld.
- Info – iets ongebruikelijks of interessants is gebeurd (state change, start/stop, feature toggle, belangrijke configuratie) zonder fout.
- Debug – uitsluitend voor lokaal/development/diagnostische gebruik; in productie standaard uitgeschakeld.
Wat loggen we
Wat loggen we waar in tabelvorm:
| Behoefte |
Oplossing |
| Requests vastleggen |
Access logging op infrastructuurniveai (API Gateway, reverse proxy, ingress) |
| Latency, throughput, foutpercentages |
Metrics (Prometheus / OpenTelemetry tellers en grafieken) |
| Request tracing |
LDV keten-tracing |
| Diagnostiek bij een specifiek probleem |
Internet trace logging (on-demand, niet standaard aan in productie) |
In de service loggen we uitsluitend ERRORs (exceptions waarbij de verwerking niet kan worden voortgezet) en WARNINGs (validatie- of authorisatiefouten). Een HTTP 500-response gaat altijd gepaard met een ERROR-logregel inclusief exception. De access logging op infrastructuurniveau registreert aanvullend de statuscode en latency van elk request.
| Situatie |
Infrastructuur |
Applicatie |
| 200 - gewone aanroep |
access log |
niet loggen |
| 400/422 - validatiefout |
access log |
WARNING als zinvol |
| 401/401 - autorisatie geweigerd |
access log |
WARNING bij verdacht patroon |
| 500 - onverwachte fout |
access log |
ERROR met exception |
Warning‑ en info‑logs worden alleen toegevoegd wanneer de ontwikkelaar of reviewer dit zinvol acht.
- Voorbeeld Warning: een controller wordt aangeroepen met ongeldige parameters (validatie faalt) maar is afgehandeld.
- Interne trace logging is standaard aan in niet‑productie om performance‑knelpunten op te sporen; in productie beperken we detailniveau en retentie.
- LDV keten‑tracering wordt toegepast wanneer ketenverkeer dit vereist conform ADR 0010, met strikte uitsluiting van PII in attributen.