# Enregistrez les événements d’audit d’action avec un récepteur d’audit natif

> Observez l'option d'audit et les appels explicites $.audit() sans contacter un service de journalisation ni écrire d'entrée sensible dans un journal d'application.

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

Une action peut définir `audit` comme un modèle de texte. À la fin réussie, le framework envoie un enregistrement d'audit à `DEF.onAudit(name, data, context)`. L'enregistrement automatique utilise le nom de puits `actions` et inclut l'id de l'action. Une action peut aussi appeler explicitement `$.audit(message, type)` ; cela émet son propre enregistrement et peut porter un type comme `info`.

L'exemple remplace le puits d'audit par un collecteur en mémoire pour inspecter son contrat. Il n'enregistre que le nom, l'id de l'action, le message et le type. Le framework prépare aussi des données de contexte et des données de requête sérialisées : un vrai puits a besoin d'une politique explicite pour les secrets, la conservation, l'accès et les échecs. Un événement d'audit n'est pas la preuve qu'une transaction métier a été validée ; l'action ne doit appeler son callback de succès qu'après la réussite de l'écriture prévue.

Dans cette version, l'événement d'audit automatique se produit après le chemin de récupération d'action réussie. il n'enregistre pas automatiquement les erreurs de validation ou les actions échouées.

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