# Registre eventos de auditoría de acciones con un receptor de auditoría nativo

> Observe la opción de auditoría y las llamadas $.audit() explícitas sin ponerse en contacto con un servicio de registro ni escribir datos confidenciales en el registro de una aplicación.

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

Una acción puede definir `audit` como una plantilla de texto. Al completarse con éxito, el framework envía un registro de auditoría a `DEF.onAudit(name, data, context)`. El registro automático usa el nombre de sumidero `actions` e incluye el id de la acción. Una acción también puede llamar explícitamente a `$.audit(message, type)`; esto emite su propio registro y puede llevar un tipo como `info`.

El ejemplo sustituye el sumidero de auditoría por un recolector en memoria para inspeccionar su contrato. Registra solo el nombre, el id de la acción, el mensaje y el tipo. El framework también prepara datos de contexto y datos de la petición serializados: un sumidero real necesita una política explícita sobre secretos, retención, acceso y fallos. Un evento de auditoría no es una prueba de que una transacción de negocio se haya confirmado; la acción solo debe llamar a su callback de éxito después de que la escritura prevista haya tenido éxito.

En esta versión, el evento de auditoría automática ocurre después de la ruta de llamamiento de acción exitosa. no registra automáticamente fallos de validación o acciones fallidas.

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