# Registra eventi di controllo delle azioni con un sink di controllo nativo

> Osserva l'opzione di controllo e le chiamate esplicite a $.audit() senza contattare un servizio di registrazione o scrivere input sensibili in un registro dell'applicazione.

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

Un'azione può impostare `audit` su un modello di testo. Al completamento riuscito, il framework invia un record di audit a `DEF.onAudit(name, data, context)`. Il record automatico usa il nome di sink `actions` e include l'id dell'azione. Un'azione può anche chiamare esplicitamente `$.audit(message, type)`; questo emette un proprio record e può portare un tipo come `info`.

L'esempio sostituisce il sink di audit con un raccoglitore in memoria per ispezionarne il contratto. Registra solo il nome, l'id dell'azione, il messaggio e il tipo. Il framework prepara anche dati di contesto e dati della richiesta serializzati: un sink reale ha bisogno di una politica esplicita per segreti, conservazione, accesso e fallimenti. Un evento di audit non è la prova che una transazione di business sia stata confermata; l'azione dovrebbe chiamare il suo callback di successo solo dopo che la scrittura prevista è riuscita.

In questa versione, l'evento di audit automatico avviene dopo il successo della via di appello. non registra automaticamente fallimenti di validazione o azioni fallite.

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