Logging-strategie voor gegenereerde backends: wat te loggen en te redacteren
Leer een logstrategie voor gegenereerde backends: wat te loggen voor auth, betalingen, workflows en integraties, plus duidelijke regels voor PII-redactie.

Waarom logging een plan nodig heeft (niet alleen meer regels)
Logs helpen alleen als ze snel echte vragen beantwoorden: wat ging kapot, wie was getroffen en kun je bewijzen wat er gebeurde. Een goede logging-strategie balanceert drie behoeften tegelijk: snelle diagnose, betrouwbare auditsporen voor kritieke acties en bescherming van gebruikersdata.
Zonder plan lopen teams meestal tegen één van twee problemen aan. Of er is niet genoeg detail om productieproblemen te debuggen, of er is te veel detail en gevoelige informatie lekt. Het tweede probleem is moeilijker terug te draaien omdat logs gekopieerd worden naar dashboards, backups en tools van derden.
Er is een constante spanning tussen nut en blootstelling. Je wilt genoeg context om een request over services en workflows te volgen, maar ook duidelijke rode lijnen voor geheimen en persoonlijke data. "Log alles" is geen strategie, het is een risico.
Verschillende mensen lezen logs om verschillende redenen, en dat moet bepalen wat je schrijft. Developers zoeken stacktraces, foutieve inputs en timing. Supportteams hebben gebruikersveilige kruimelsporen nodig om issues te reproduceren. Securityteams letten op patronen zoals herhaalde mislukte aanmeldingen. Compliance-teams en auditors geven om wie wat deed en wanneer.
Stel verwachtingen vroeg voor niet-technische teams: logs zijn geen database en geen plek om "details voor het geval dat" op te slaan. Als je klantzichtbare records nodig hebt, bewaar die in juiste tabellen met toegangscontrole, retentieregels en toestemming. Logs zijn kortdurend operationeel bewijs.
Als je bouwt met een platform zoals AppMaster, behandel logging als onderdeel van het backend-product, niet als een bijzaak. Beslis van tevoren welke events traceerbaar moeten zijn (auth, betalingen, workflow-stappen, integraties), welke velden altijd veilig zijn en welke geredigeerd moeten worden. Dat houdt logs consistent terwijl je app wordt geregenereerd en groeit.
Logtypen en niveaus in gewone taal
Een praktische strategie begint met gedeelde namen voor de soorten berichten die je vastlegt. Als iedereen dezelfde levels en event-namen gebruikt, kun je sneller zoeken, alerts betrouwbaar instellen en vermijden dat lawaaierige logs de echte issues verbergen.
Logniveaus die je echt kunt gebruiken
Logniveaus gaan over urgentie, niet over "hoeveel tekst". Een klein setje dekt de meeste teams:
- Debug: details voor developers voor troubleshooting (meestal uit in productie).
- Info: normale, verwachte events (een gebruiker heeft een profiel bijgewerkt, een job is klaar).
- Warn: iets onverwachts maar het systeem werkt nog (een retry, een trage query).
- Error: de actie is mislukt en heeft aandacht nodig (een betaling aanmaken is mislukt, een DB-fout).
- Security: verdachte of gevoelige situaties (tokenmisbruikpatronen, herhaalde mislukte aanmeldingen).
- Audit: “wie deed wat, en wanneer” voor compliance en onderzoeken.
Security en audit worden vaak verwisseld. Security-logs helpen bedreigingen te detecteren. Audit-logs helpen je later te reconstrueren en te bewijzen wat er gebeurde.
Gestructureerde logs: consistente velden verslaan vrije tekst
Vrije-tekst logs zijn moeilijk te filteren en makkelijk fout te krijgen. Gestructureerde logs houden dezelfde velden elk keer (vaak als JSON), zodat zoekopdrachten en dashboards betrouwbaar blijven. Dit is nog belangrijker bij gegenereerde code, omdat consistentie een van de grootste voordelen is die je kunt behouden.
Streef ernaar een event te loggen met velden (zoals event_name, request_id, user_id, status) in plaats van een alinea tekst.
Event vs trace vs metric
Deze termen overlappen in het dagelijks gebruik, maar lossen verschillende problemen op:
- Event (log): één ding dat gebeurde (login succesvol, webhook ontvangen).
- Trace: het pad door services voor één request.
- Metric: een getal over tijd (error rate, wachtrijlengte, betaling-latentie).
Tijdregels: kies er één en houd je eraan
Gebruik ISO 8601-timestamps en log alles in UTC. Als je de tijdzone van de gebruiker voor weergave nodig hebt, sla die dan als apart veld op. Dit voorkomt tijdzoneverwarring tijdens incidenten.
Een praktische taxonomie: gemeenschappelijke velden die elke log zou moeten hebben
De sleutelbeslissing is simpel: elk belangrijk event moet door een mens leesbaar en door een machine filterbaar zijn. Dat betekent korte messages en consistente velden.
De kernvelden (gebruik ze overal)
Als elke logvermelding dezelfde backbone heeft, kun je één request over services en deploys traceren, zelfs wanneer de backend wordt geregenereerd of opnieuw ingezet.
timestampenseverity(info/warn/error)event(een stabiele naam zoalsauth.login.succeeded)service,environmentenbuild(versie of commit)request_id(uniek per inkomend request)route,statusenduration_ms
Behandel severity, event en request_id als verplicht. Zonder deze kun je niet betrouwbaar zoeken, groeperen of correleren.
Contextvelden (alleen toevoegen wanneer relevant)
Context maakt logs nuttig zonder ze tot een data dump te maken. Voeg velden toe die uitleggen wat het systeem probeerde te doen.
user_id(interne ID, geen e-mail of telefoon)tenant_idoforg_id(voor multi-tenant apps)workflow(procesnaam of stap)integration(provider/naam van systeem)feature_flag(flag key als gedrag verandert)
In een AppMaster-backend waar logica loopt via een Business Process, kan het loggen van workflow en step laten zien waar een request vastliep en toch korte berichten houden.
Houd de message-tekst tot één regel samenvatting (wat er gebeurde), en zet details in velden (waarom het gebeurde). Een gestructureerde logentry kan er bijvoorbeeld zo uitzien:
{
"severity": "info",
"event": "payment.intent.created",
"service": "backend",
"environment": "prod",
"build": "2026.01.25-1420",
"request_id": "req_8f3a...",
"route": "POST /checkout",
"status": 200,
"duration_ms": 184,
"user_id": 48291,
"tenant_id": 110,
"integration": "stripe"
}
Met deze aanpak kun je code regenereren, infrastructuur veranderen en nieuwe workflows toevoegen terwijl logs vergelijkbaar blijven over tijd.
Auth-logging: wat vastleggen zonder credentials te bloot te geven
Auth-logs zijn waar je leert wat er gebeurde tijdens accountovernamepogingen of wanneer gebruikers zeggen: "Ik kon niet inloggen." Het is ook waar teams per ongeluk geheimen lekken. Het doel is hoge traceerbaarheid met nul gevoelige waarden.
Behandel auth als twee sporen die verschillende behoeften dienen:
- Audit logs beantwoorden “wie deed wat en wanneer.”
- Debug/ops logs leggen uit “waarom het mislukte.”
Wat te loggen voor authenticatie en sessies
Registreer sleutelgebeurtenissen als gestructureerde entries met stabiele namen en een correlatie- of request-id zodat je één aanmelding over systemen kunt volgen.
Log aanmeldpogingen (succes/mislukt) met een reden-code zoals bad_password, unknown_user, mfa_required of account_locked. Volg de MFA-lifecycle (challenge uitgegeven, methode, succes/mislukking, fallback gebruikt). Volg wachtwoordreset-events (aangevraagd, token gestuurd, token geverifieerd, wachtwoord gewijzigd). Volg sessie- en tokenlevenscyclus-events (aangemaakt, vernieuwd, ingetrokken, verlopen). Leg ook admin-acties op auth vast, zoals rolwijzigingen en het deactiveren/activeren van accounts.
Als je AppMaster’s gegenereerde backend en authenticatiemodules gebruikt, richt je dan op het zakelijke resultaat (toegestaan of geweigerd) in plaats van interne implementatiedetails. Dat houdt logs stabiel zelfs wanneer de app wordt geregenereerd.
Autorisatie-beslissingen (access control)
Elke belangrijke allow of deny moet uitlegbaar zijn. Log het resource-type en actie, de gebruikersrol en een korte reden-code. Vermijd het loggen van volledige objecten of queryresultaten.
Voorbeeld: een supportmedewerker probeert een admin-only scherm te openen. Log decision=deny, role=support, resource=admin_panel, reason=insufficient_role.
Redigeer geheimen en vang security-signalen op
Log nooit wachtwoorden, eenmalige codes, recovery-codes, ruwe access/refresh-tokens, session IDs, API-keys, Authorization-headers, cookies, volledige JWT's of volledige e-mail/SMS-berichtinhoud.
Log in plaats daarvan veilige signalen: gehashte of afgeknotte identifiers (bijv. de laatste 4 van een token-hash), IP en user agent (overweeg masking) en anomalie-tellers (veelvuldige failures, ongebruikelijke geolocatie-wisselingen, herhaald tokenmisbruik). Deze signalen helpen aanvallen te detecteren zonder te lekken wat een aanvaller nodig heeft.
Betalingslogging: traceerbaarheid voor Stripe en vergelijkbare providers
Betalingslogs moeten één vraag snel beantwoorden: wat gebeurde er met deze betaling, en kun je het bewijzen. Focus op traceerbaarheid, niet op ruwe payloads.
Log de betalingslevenscyclus als een reeks kleine, consistente events. Je hoeft niet alles op te nemen, maar wel de belangrijke wendingen: intent aangemaakt, bevestigd, mislukt, terugbetaald en elk geschil of chargeback.
Voor elk event sla compacte referenties op die je in staat stellen logs te matchen met provider-dashboards en supporttickets:
- provider (bijvoorbeeld Stripe)
- provider_object_id (payment_intent, charge, refund, dispute ID)
- amount en currency
- status (created, confirmed, failed, refunded, disputed)
error_codeen een korte, genormaliseerdeerror_message
Houd gevoelige data uit logs, zelfs in debugmodus. Log nooit volledige kaartnummers, CVC of volledige factuuradressen. Als je klantcorrelatie nodig hebt, log je interne customer_id en een interne order_id, niet een volledige naam, e-mail of adres.
Webhooks: log de omslag, niet de body
Webhooks kunnen veel ruis geven en bevatten vaak meer persoonlijke data dan verwacht. Standaard: log alleen event_id, event_type en het verwerkingsresultaat (accepted, rejected, retried). Als je het weigert, log een duidelijke reden (signature check failed, unknown object, duplicate event). Sla de volledige payload alleen op op een veilige, toegang-beperkte plek als je die echt nodig hebt.
Geschillen en refunds hebben een auditspoor nodig
Refunds en dispute-responses zijn risicovolle acties. Registreer wie de actie triggerde (user_id of service_account), wanneer het gebeurde en wat er werd gevraagd (refund-bedrag, reden-code). In AppMaster betekent dit vaak het toevoegen van een duidelijke logstap binnen het Business Process dat Stripe aanroept.
Voorbeeld: een supportagent refundeert een bestelling van $49. Je logs moeten order_id, de refund-ID van Stripe, de agent’s user_id, de timestamp en de eindstatus tonen, zonder kaart- of adresgegevens te onthullen.
Workflow-logging: maak bedrijfsprocessen observeerbaar
Workflows zijn waar het echte werk gebeurt: een bestelling wordt goedgekeurd, een ticket wordt gerouteerd, een refund wordt gevraagd, een klant wordt geïnformeerd. Als je backend gegenereerd wordt vanuit een visueel proces (zoals AppMaster’s Business Process Editor), moet logging het workflow-verhaal volgen, niet alleen de code. Anders zie je fouten zonder het verhaal.
Behandel een workflow-run als een reeks events. Houd het simpel: een stap gestart, voltooid, mislukt of opnieuw geprobeerd. Met dat model kun je reconstrueren wat er gebeurde, zelfs wanneer veel runs tegelijk plaatsvinden.
Voor elk workflow-event, neem een klein, consistent setje velden op:
- workflow-naam en versie (of laatst bewerkt timestamp)
run_id(unieke ID voor die uitvoering)- stapnaam, stap-type, pogingnummer
- event-type (started, completed, failed, retried) en status
- timing (stapduur en totale runtime tot nu toe)
Inputs en outputs zijn waar teams vaak in de problemen komen. Log de vorm van data, niet de data zelf. Geef de voorkeur aan schema-namen, lijsten van aanwezige velden of stabiele hashes. Als je meer debuggingdetail nodig hebt, registreer aantallen en ranges (zoals items=3 of total_cents=1299) in plaats van ruwe namen, e-mails, adressen of vrije tekst.
Operator-acties moeten als volwaardige events worden behandeld omdat ze uitkomsten veranderen. Als een admin een verzoek goedkeurt, een run annuleert of een stap overschrijft, log wie het deed (user_id, rol), wat ze deden (actie), waarom (reden-code) en de before/after-status.
Voorbeeld: een "Expense approval"-workflow faalt bij "Notify manager" door een messaging-outage. Goede logs tonen run_id, de falende stap, retry-pogingen en bestede tijd. Je kunt dan beantwoorden of het uiteindelijk verzonden is, wie het goedkeurde en welke runs vastzitten.
Integratielogging: API's, messaging en derde partijen
Integraties zijn waar backends vaak stilletjes falen. De gebruiker ziet "er is iets mis", terwijl de echte oorzaak een rate limit, een verlopen token of een trage provider is. Logging moet elke externe aanroep makkelijk te traceren maken zonder logs te veranderen in een kopie van derdepartijdata.
Log elke integratie-oproep als een event met een consistente vorm. Focus op "wat gebeurde" en "hoe lang het duurde", niet op "dump de payload".
Wat te loggen voor elke externe oproep
Leg genoeg vast om te debuggen, meten en auditen:
- providernaam (bijvoorbeeld Stripe, Telegram, email/SMS, AWS, OpenAI)
- endpoint of operatienaam (jouw interne naam, niet de volledige URL)
- methode/actie, status/resultaat, latentie in ms, retry-aantal
- correlatie-identifiers (jouw
request_idplus elke provider-side ID die je ontvangt) - circuit breaker en backoff-events (opened, half-open, closed, retry_scheduled)
Correlatie-IDs zijn het belangrijkst wanneer een workflow meerdere systemen raakt. Als een klantactie zowel een e-mail als een betalingscheck triggert, moet dezelfde request_id in alle gerelateerde logs voorkomen, plus de provider’s message ID of payment ID wanneer beschikbaar.
Als een oproep faalt, classificeer het stabiel over providers heen. Dashboards en alerts worden veel nuttiger dan ruwe fouttekst.
- auth error (verlopen token, ongeldige signature)
- rate limit (HTTP 429 of provider-specifieke code)
- validation error (foute parameters, schema mismatch)
- timeout/network (connect timeout, DNS, TLS)
- provider fault (5xx, service unavailable)
Vermijd het standaard loggen van ruwe request- of response-bodies. Als je een sample moet vastleggen voor debugging, bescherm het dan achter een kortstondige flag en sanitize eerst (verwijder tokens, geheime sleutels, e-mails, telefoonnummers, volledige adressen). In AppMaster, waar veel integraties visueel zijn geconfigureerd, houd logvelden consistent terwijl de flow verandert.
PII-veilige redactieregels die ontwikkelaars kunnen volgen
Redactie werkt het beste als het saai en automatisch is. Logs moeten helpen debuggen en auditen zonder dat iemand iemands identiteit kan reconstrueren of toegang kan stelen als logs uitlekken.
Groepeer gevoelige data in een paar buckets zodat iedereen dezelfde termen gebruikt:
- identifiers: volledige naam, nationale ID's, klant-ID's die aan een persoon gekoppeld zijn
- contactinfo: e-mail, telefoon, postadres
- financieel: kaartnummers, bankgegevens, uitbetalingsinformatie
- locatie en gezondheid: precieze locatie, medische data
- credentials: wachtwoorden, API-keys, sessie-cookies, OAuth-codes, refresh-tokens
Kies daarna één actie per bucket en houd je daaraan:
- volledig verwijderen: credentials, geheimen, ruwe tokens, volledige kaartnummers
- maskeren: e-mails en telefoonnummers (houd een klein deel voor support)
- afkappen: lange vrije-tekstvelden (supportnotities kunnen PII verbergen)
- hashen: stabiele identifiers wanneer je groepering nodig hebt maar niet de waarde (gebruik een keyed hash, geen plain SHA)
- tokenizen: vervang door een interne referentie (bijv.
user_id) en sla de echte waarde elders op
Veilige voorbeelden (wat je in logs bewaart):
- e-mail:
j***@example.com(mask local part, houd domain) - telefoon:
***-***-0199(houd laatste 2–4 cijfers) - adres: verwijder volledig; log alleen
countryofregionindien nodig - tokens: verwijder volledig; log alleen
token_present:trueof het token-type
Redactie moet werken binnen geneste objecten en arrays, niet alleen top-level velden. Een betalingspayload kan customer.email en charges[].billing_details.address bevatten. Als je logger alleen het eerste niveau controleert, mist hij de echte leaks.
Gebruik een allowlist-first aanpak. Definieer een kleine set velden die altijd veilig zijn om te loggen (request_id, user_id, event, status, duration_ms) en een denylist van bekende gevoelige keys (password, authorization, cookie, token, secret, card_number). In tools zoals AppMaster, waar backends gegenereerd worden, houdt het plaatsen van deze regels in gedeelde middleware het gedrag consistent over elk endpoint en workflow.
Hoe je de strategie stap voor stap implementeert
Schrijf je logschema op voordat je code aanraakt. Als je backend gegenereerd wordt (bijv. een Go-service geproduceerd door AppMaster), wil je een plan dat regeneratie overleeft: consistente event-namen, consistente velden en één plek waar redactie wordt afgedwongen.
Een eenvoudige rollout-plan
Pas dezelfde regels overal toe: API-handlers, achtergrondjobs, webhooks, geplande workflows.
- Definieer herbruikbare event-namen zoals
auth.login_succeeded,payment.webhook_received,workflow.step_failed,integration.request_sent. Bepaal voor elk welke velden verplicht zijn. - Voeg correlatievelden vroeg toe en maak ze verplicht:
request_id,trace_id(als je die hebt),user_id(of anonymous) entenant_idvoor multi-tenant apps. Genereerrequest_idaan de rand en geef deze door in elke interne call. - Plaats redactie aan de logging-grens, voordat iets geschreven wordt. Gebruik middleware of een logging-wrapper die gevoelige keys uit request- en response-bodies verwijdert of maskeert.
- Stel logniveaus per omgeving in. In productie geef voorkeur aan
infovoor sleutel-events enwarn/errorvoor failures. Vermijd verbositeit met debug-dumps. In development mag meer detail, maar houd redactie aan. - Bewijs dat het werkt met realistische testpayloads. Voeg PII bewust toe (e-mails, telefoonnummers, access tokens) en bevestig dat opgeslagen logs alleen veilige waarden tonen.
Na deploy: oefen één keer per maand een incident. Kies een scenario (een mislukte Stripe-webhook-replay, een piek van inlogfouten, een vastgelopen workflow) en check of je logs beantwoorden wat er gebeurde, wie, wanneer en waar, zonder geheimen bloot te geven.
Maak het schema zelfcorrigerend
Maak het moeilijk om verplichte velden te negeren. Een goede gewoonte is builds laten falen wanneer verplichte velden ontbreken en steekproefsgewijze controle van productie-logs op:
- geen ruwe wachtwoorden, tokens of volledige kaartgegevens
- elk request heeft
request_iden (indien relevant)tenant_id - errors bevatten een veilige
error_codeplus context, niet een volledige payload-dump
Veelvoorkomende fouten die risico of blinde vlekken creëren
Logs worden nutteloos (of gevaarlijk) als ze veranderen in een stortplaats. Het doel is duidelijkheid: wat gebeurde, waarom gebeurde het en wie of wat het triggerde.
1) Geheimen lekken zonder het te merken
De meeste lekkages zijn per ongeluk. Veelvoorkomende boosdoeners zijn request-headers, auth-tokens, cookies, webhook-signatures en "behulpzame" debugging die volledige payloads print. Een enkele logregel met een Authorization-header of een webhook-secret kan je logstore veranderen in een credential-vault.
Als je een platform gebruikt dat code genereert, zet redactieregels op de randen (ingress, webhook-handlers, integratieclients) zodat elke service dezelfde veiligheidsdefaults erft.
2) Vrije-tekst logs die je niet kunt doorzoeken
Logs als “User failed to login” zijn leesbaar maar moeilijk te analyseren. Vrije tekst bemoeilijkt filteren op event-type, vergelijken van foutoorzaken of het bouwen van alerts.
Geef de voorkeur aan gestructureerde velden (event, actor_id, request_id, outcome, reason_code). Houd de menselijke zin optioneel, niet de enige bron van waarheid.
3) Te veel payloads loggen, te weinig beslissingen loggen
Teams registreren vaak volledige request/response-bodies maar vergeten de belangrijke beslissing te loggen. Voorbeelden: "payment rejected" zonder provider-status, "access denied" zonder policy-regel, "workflow failed" zonder stap en reden-code.
Als iets misgaat, heb je meestal het beslissingsspoor nodig meer dan de ruwe payload.
4) Audit en debug mengen
Audit-logs moeten stabiel en makkelijk te reviewen zijn. Debug-logs zijn lawaaierig en veranderen vaak. Als je ze mengt, worden compliance-reviews pijnlijk en raken belangrijke audit-events zoek.
Houd de lijn duidelijk: audit-logs registreren wie wat deed en wanneer. Debug-logs leggen uit hoe het systeem daar kwam.
5) Geen retentieplan
Logs voor altijd bewaren vergroot risico en kosten. Te snel verwijderen breekt incidentresponse en chargeback-onderzoeken.
Stel verschillende retentieperioden in per logtype (audit vs debug) en zorg dat exports, backups en derdepartij-log-sinks hetzelfde beleid volgen.
Korte checklist en volgende stappen
Als logs hun werk doen, moet je één vraag snel kunnen beantwoorden: “Wat gebeurde er met dit request?” Gebruik de checks hieronder om gaten te vinden voordat ze tot nachtelijke incidenten leiden.
Korte checklist
Voer deze checks uit met een echt productie-request (of een staging-run die dit nabootst):
- End-to-end trace: kun je één gebruikersactie over services volgen met één
request_iden de belangrijke hops zien? - Auth-safety: vermijden auth-logs 100% wachtwoorden, sessiecookies, JWTs, API-keys, magic links en reset-tokens?
- Betalings-traceerbaarheid: registreren betalingslogs provider-identifiers en statuswijzigingen terwijl kaartgegevens of volledige factuurdetails nooit worden opgeslagen?
- Workflow-visibility: zijn bedrijfsprocessen doorzoekbaar op
run_idenstep_name, met duidelijke start/succes/fout en duur? - Integratie-clarity: log je voor derdepartijoproepen provider, operatienaam, latentie, status en een veilige foutsamenvatting zonder payload-dumps?
Als een item “meestal” is, behandel het als “nee”. Dit werkt alleen wanneer regels consistent en automatisch worden toegepast.
Volgende stappen
Zet de checklist om in regels die je team kan afdwingen. Begin klein: één gedeeld schema, één redactiebeleid en een paar tests die falen als gevoelige velden doorkomen.
Schrijf je logschema op (gemeenschappelijke velden en naamgeving) en je redactie-lijst (wat gemaskeerd, gehashed of verwijderd moet worden). Voeg code-reviewregels toe die logs met ruwe request-bodies, headers of ongevilterde gebruikersobjecten afkeuren. Maak een paar “veilige log-events” voor auth, betalingen, workflows en integraties zodat mensen consistente patronen kopiëren. Voeg geautomatiseerde checks toe (unit tests of lint-regels) die verboden velden zoals password, token en authorization detecteren. Herzie elk kwartaal en bevestig dat sampling, logniveaus en retentie nog steeds bij je risico en compliance passen.
Als je bouwt op AppMaster, helpt het om deze regels te centraliseren en her te gebruiken in je gegenereerde Go-backends, workflows en integraties. Het bijhouden van schema en redactie-logica op één plek maakt het ook makkelijker te onderhouden terwijl je app verandert bij regeneratie op appmaster.io.
FAQ
Begin met het opschrijven van de vragen die je logs tijdens een incident moeten beantwoorden: wat mislukte, wie was getroffen en waar gebeurde het. Definieer daarna een klein schema dat je overal gebruikt (zoals event, severity, request_id, service, environment) zodat elk team consistent kan zoeken en correleren.
Een goede standaardset is event, severity en request_id, plus basale context zoals service, environment, route, status en duration_ms. Zonder event en request_id kun je vergelijkbare problemen niet betrouwbaar groeperen of één gebruikersactie end-to-end volgen.
Security-logs zijn bedoeld om nu verdacht gedrag te detecteren, zoals herhaalde mislukte aanmeldingen of tokenmisbruikpatronen. Audit-logs zijn bedoeld om later te bewijzen wat er gebeurde en richten zich op wie wat deed en wanneer voor kritieke acties zoals rolwijzigingen, refunds of toegangsoverrides.
Log geen ruwe wachtwoorden, eenmalige codes, access- of refresh-tokens, Authorization-headers, cookies, API-sleutels of volledige JWT's. Log in plaats daarvan veilige uitkomsten en reden-codes, plus interne identifiers zoals user_id en request_id, zodat je kunt debuggen zonder logs in een credentialstore te veranderen.
Log de levenscyclus van een betaling als kleine, gestructureerde events die provider-IDs en je interne IDs refereren, zoals order_id en customer_id. Richt je op bewijsvoering: bedragen, valuta, statuswijzigingen en genormaliseerde foutcodes zijn meestal voldoende om problemen te matchen zonder gevoelige betaalgegevens op te slaan.
Log de webhook-omslag (envelope) en het resultaat van je verwerking, niet de volledige body. Leg het provider event_id, event_type, of je het accepteerde of weigerde vast, en een duidelijke reden bij weigering, zodat je veilig kunt replayen zonder persoonlijke data in je logs te kopiëren.
Behandel elke workflow-run als een traceerbaar verhaal door stapstart, voltooiing, fout en retries te loggen met een run_id, stapnaam en timings. Vermijd het loggen van volledige inputs en outputs; log vormen, aantallen en veilige samenvattingen zodat de workflow observeerbaar blijft zonder gebruikerscontent te lekken.
Log elke externe oproep met providernaam, operatienaam, latentie, resultaatstatus, retry-aantal en correlatie-identifiers zoals request_id. Als het faalt, classificeer de fout in stabiele categorieën (auth, rate limit, validation, timeout, provider fault) zodat alerts en dashboards consistent blijven over providers heen.
Gebruik een allowlist-eerst aanpak: log alleen velden die je expliciet als veilig hebt gemarkeerd, en redacteer alles op de logging-grens. Voor PII default naar maskeren of tokenizen, en voor credentials en secrets: drop ze volledig zodat ze niet via dashboards, backups of log-exports kunnen lekken.
Plaats het logschema en de redactie-regels op één gedeelde plek die voor elke endpoint en workflow draait, zodat regeneratie geen drift veroorzaakt. In AppMaster: log stabiele bedrijfsuitkomsten en event-namen in plaats van interne implementatiedetails, zodat logs vergelijkbaar blijven tussen builds terwijl je backend evolueert.


