# Eventos de auditoria de ação com uma auditoria nativa

> Observe a opção de auditoria e exibir chamadas $.audit() sem entrar em contato com um serviço de logging ou escrever uma entrada sensível para um log da aplicação.

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

Uma ação pode definir `audit` como um modelo de texto. Ao concluir com sucesso, o framework envia um registo de auditoria para `DEF.onAudit(name, data, context)`. O registo automático usa o nome de sumidouro `actions` e inclui o id da ação. Uma ação também pode chamar explicitamente `$.audit(message, type)`; isto emite o seu próprio registo e pode levar um tipo como `info`.

O exemplo substitui o sumidouro de auditoria por um recolhedor em memória para inspecionar o seu contrato. Regista apenas o nome, o id da ação, a mensagem e o tipo. O framework também prepara dados de contexto e dados do pedido serializados: um sumidouro real precisa de uma política explícita para segredos, retenção, acesso e falhas. Um evento de auditoria não é prova de que uma transação de negócio foi confirmada; a ação só deve chamar o seu callback de sucesso depois de a escrita pretendida ter tido sucesso.

Nesta versão, o evento de auditoria automática ocorre após o caminho de chamada de ação bem sucedido. não registra automaticamente falhas de validação ou ações fracassadas.

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