Diff completo de cada mutação. Quem, quando, o quê e de onde.
AuditLog é append-only com 200+ tipos de ação. Captura previousValues, newValues, IP, user agent, user email. Retenção configurável. Export para SIEM.
Sistema

200+
tipos de ação
Append-only
imutável
Diff
previous + new values
2 anos
retenção default
Recursos do AuditLog
Captura Automática
AuditService.logWithContext() chamado em todos endpoints de mutação. Padrão obrigatório nas API routes.
- AuditService.logWithContext()
- Endpoints de mutação
- Padrão obrigatório
Diff Visualizado
Dashboard exibe lado a lado o estado anterior e o atual. Útil para incident response.
- Side-by-side diff
- Estado anterior + atual
- Incident response
Filtros Combinados
Filtre por usuário, ação, resource, IP, período. Operadores AND/OR.
- Usuário, ação, resource, IP
- AND/OR
- Período customizável
Export para SIEM
Export em JSON, CSV. Integração com Splunk, Datadog, Elasticsearch via webhook.
- JSON, CSV
- Splunk, Datadog, Elasticsearch
- Webhook real-time
Retenção Configurável
Default 2 anos. Configurável por organização. Antes de purge, export automático opcional.
- Default 2 anos
- Configurável
- Export antes de purge
Append-Only
Logs não podem ser editados ou deletados manualmente. Garantia de integridade para compliance.
- Imutável
- Compliance garantido
- Sem edição manual
Logs do Sistema
Workers e automações também registram (usuário = 'sistema'). Útil para distinguir ação humana vs automática.
- Workers registram
- Usuário = 'sistema'
- Humano vs automático
Multi-tenant Isolado
Cada organização vê apenas seus logs. Filtro por organizationId no service.
- Isolamento por org
- Sem cross-tenant
- Filtro automático
Consultar audit via API
bash
curl "https://api.billing.kobana.com.br/v1/audit-logs?\
action=invoice.voided&\
since=2026-06-01&\
limit=50" \
-H "Authorization: Bearer sk_live_..."response
{
"data": [
{
"id": "al_xyz",
"user_email": "ana@empresa.com.br",
"action": "invoice.voided",
"resource_type": "invoice",
"resource_id": "inv_abc",
"resource_name": "INV-001234",
"previous_values": { "status": "open" },
"new_values": { "status": "void", "voided_at": "2026-06-06T..." },
"ip_address": "189.123.45.67",
"created_at": "2026-06-06T12:30:00Z"
}
]
}