logging-backend
Wide Events y Canonical Log Lines para observabilidad real.
Triggers
| Frases que activan el skill |
|---|
| “agregar logging” |
| “mejorar logs” |
| “wide events” |
| “observabilidad” |
| “canonical log lines” |
| “structured logging” |
Concepto Core
Un Wide Event es un único log JSON que captura el ciclo completo de un request. En lugar de múltiples logs dispersos, emitís UN evento al final con toda la información agregada.
Comparación:
// ❌ Log tradicional - múltiples líneas dispersas
[10:30:00] INFO: User 789 logged in
[10:30:01] INFO: Fetching orders for user 789
[10:30:02] DEBUG: Query executed in 45ms
[10:30:03] ERROR: Failed to send email
// ✅ Wide Event - todo en un solo registro
{
"user": { "id": "789" },
"action": "fetch_orders",
"infra": { "db_time_ms": 45 },
"error": { "type": "email_failed" }
}
Beneficios:
- Debuggear con UN query en vez de correlacionar múltiples logs
- Análisis con SQL simple sobre campos estructurados
- Sin pérdida de contexto entre logs
- Tail sampling efectivo
Workflow del skill
Fase 1: Middleware Base
- Crear middleware que inicializa wide event al inicio del request
- Adjuntar evento al contexto (AsyncLocalStorage, req.wideEvent)
- Emitir log al finalizar request
Fase 2: Enriquecimiento
- En cada handler/service, agregar campos al wide event
- Helpers tipados:
enrichUser(),enrichBusiness(),enrichError() - Acumular métricas: queries, cache hits, llamadas externas
Fase 3: Tail Sampling
- Implementar función que decide qué loggear
- Siempre: errores, latencia alta, usuarios específicos
- Samplear porcentaje de requests normales
Fase 4: Colorización (Dev)
- Colores por nivel (ERROR=rojo, WARN=amarillo)
- Colores por contexto (Request=azul, User=verde)
- Formato legible en terminal
Ejemplo de Wide Event
{
"timestamp": "2024-01-15T10:30:00.000Z",
"level": "info",
"service": "order-api",
"trace_id": "abc123",
"request": {
"method": "POST",
"path": "/api/orders",
"status": 201,
"duration_ms": 567
},
"user": {
"id": "user_789",
"plan": "premium"
},
"business": {
"action": "create_order",
"entity_id": "ord_456",
"order": {
"total": 299.99,
"items_count": 5
}
},
"infra": {
"db": { "queries_count": 6, "total_time_ms": 180 },
"cache": { "hits": 3, "misses": 1 },
"external_calls": [
{ "service": "payment-gateway", "status": 200, "duration_ms": 234 }
]
},
"error": null
}
Checklist rápido
- Middleware que crea wide event por request
- Contexto accesible en toda la cadena
- Campos request: method, path, status, duration_ms
- Campos user: id, plan, roles
- Campos business: entidades del dominio
- Campos infra: db_queries, cache_hits, external_calls
- Campos error: code, message, stack
- Tail sampling configurado
- Formato JSON en prod, coloreado en dev
Anti-patrones
| Anti-Pattern | Por qué está mal |
|---|---|
| Múltiples logs por request | Pierde contexto, difícil correlacionar |
| Solo structured logging | No es lo mismo que wide events |
| Solo OTel | Traces difíciles de queryar, sin contexto de negocio |
| Sin tail sampling | Demasiado volumen, costos altos |
| Sin contexto de negocio | Solo datos técnicos, no ayuda a debugging real |
Troubleshooting
| Problema | Causa | Solución |
|---|---|---|
user: null en todos los logs | Auth middleware corre después del wide event | Mover auth middleware antes |
db: { queries_count: 0 } | No se usa trackDbQuery() | Wrappear queries con helper |
| Logs muy grandes en prod | Sin tail sampling | Samplear solo 1-10% del tráfico normal |
| No correlacionan entre servicios | No se propaga trace_id | Agregar header x-trace-id |
Referencias del skill
wide-event-schema.md- Esquema JSON completoimplementation.md- Código de middleware y helpersanti-patterns.md- Qué NO hacercolorization.md- Configuración de colores
Herramientas disponibles
Bash- Ejecutar comandosRead- Leer código existenteWrite- Crear archivos de loggingEdit- Modificar código existenteGlob- Buscar archivosGrep- Buscar patrones