# Recordactie-audit evenementen met een inheemse audit zink

> Volg de auditoptie en uitdrukkelijke $.audit() oproepen zonder contact op te nemen met een logging service of het schrijven van gevoelige input naar een applicatie-log.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: nl
Content-SHA256: ce474b30e28e2295f56dd6f1a1f2978b03a70c371665aaa84825909bcd2a4e72
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Een actie kan `audit` instellen op een tekstsjabloon. Bij succesvolle afronding stuurt het framework een auditrecord naar `DEF.onAudit(name, data, context)`. Het automatische record gebruikt de sinknaam `actions` en bevat de id van de actie. Een actie kan ook expliciet `$.audit(message, type)` aanroepen; dat zendt een eigen record uit en kan een type zoals `info` meedragen.

Het voorbeeld vervangt de audit-sink door een verzamelaar in het geheugen om het contract te inspecteren. Het legt alleen naam, actie-id, bericht en type vast. Het framework bereidt ook contextgegevens en geserialiseerde requestgegevens voor: een echte sink heeft een expliciet beleid nodig voor geheimen, bewaartermijn, toegang en fouten. Een auditgebeurtenis is geen bewijs dat een zakelijke transactie is gecommit; de actie hoort haar succes-callback pas aan te roepen nadat de beoogde schrijfactie is gelukt.

In deze versie gebeurt het automatische audit evenement na de succesvolle actie callback pad. Het logt niet automatisch validatiefouten of mislukte acties.

```js definitions/audit.js
MAIN.auditEvents = [];
DEF.onAudit = function(name, data) {
	MAIN.auditEvents.push({ sink: name || null, action: data.action, message: data.message || '', type: data.type || null });
};

NEWACTION('AuditExample|save', {
	input: '*name:String',
	audit: 'Saved the example',
	action: function($) {
		$.callback({ ok: true });
	}
});

NEWACTION('AuditExample|explicit', {
	action: function($) {
		$.audit('Explicit example event', 'info');
		$.success();
	}
});

NEWACTION('AuditExample|fail', {
	audit: 'This must not become a success event',
	action: function($) {
		$.invalid(409);
	}
});
```

```js controllers/audit.js
exports.install = function() {
	ROUTE('POST /save/ --> *AuditExample|save');
	ROUTE('POST /explicit/ --> *AuditExample|explicit');
	ROUTE('POST /fail/ --> *AuditExample|fail');
	ROUTE('GET /events/', function($) { $.json(MAIN.auditEvents); });
};
```
