# Evenimentele de audit de acțiune cu un audit nativ sink

> Observați opțiunea de audit și exprimați apelurile $.audit() fără a contacta un serviciu de înregistrare sau să scrieți intrări sensibile la un jurnal de aplicație.

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

O acțiune poate seta `audit` ca șablon de text. La finalizarea cu succes, framework-ul trimite o înregistrare de audit către `DEF.onAudit(name, data, context)`. Înregistrarea automată folosește numele de sink `actions` și include id-ul acțiunii. O acțiune poate apela și explicit `$.audit(message, type)`; aceasta emite propria înregistrare și poate purta un tip precum `info`.

Exemplul înlocuiește sink-ul de audit cu un colector în memorie pentru a-i inspecta contractul. Înregistrează doar numele, id-ul acțiunii, mesajul și tipul. Framework-ul pregătește și date de context și date serializate ale cererii: un sink real are nevoie de o politică explicită pentru secrete, retenție, acces și eșecuri. Un eveniment de audit nu este dovada că o tranzacție de business a fost confirmată; acțiunea trebuie să apeleze callback-ul de succes abia după ce scrierea intenționată a reușit.

În această versiune, evenimentul de audit automat apare după calea de apel de acțiune de succes. nu înregistrează automat eșecurile de validare sau acțiunile eşuate.

```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); });
};
```
