Registro en aplicaciones JavaScript: mejores prácticas para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Registro en aplicaciones JavaScript: mejores prácticas para principiantes



El registro es la base de la depuración y monitoreo de cualquier aplicación. Sin registros de calidad, estará buscando "una aguja en un pajar" cuando algo salga mal. En este artículo, analizaremos las mejores prácticas de registro en JavaScript (Node.js), adecuadas tanto para proyectos pequeños como para producción.



1. ¿Por qué no debería confiar en console.log?



Muchos desarrolladores principiantes usan console.log para todo. Es conveniente en la etapa de desarrollo, pero en un entorno de producción este enfoque genera problemas:



  • Sin niveles de registro — no puede filtrar errores de mensajes informativos.
  • Difícil gestionar la salida — no puede desactivar registros para módulos específicos.
  • Rendimiento deficiente — la serialización de objetos en console.log puede ser costosa.
  • Falta de estructura — los registros no tienen un formato unificado (JSON, hora, nivel).


En su lugar, use bibliotecas especializadas. Aquí hay un ejemplo simple pero correcto usando Winston:



// logger.jsconst winston = require('winston');

const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }), ],});

if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple(), }));}

module.exports = logger;


2. Niveles de registro: cuándo usar cada uno



Los niveles de registro estándar (en orden ascendente de gravedad): debug, info, warn, error. Es importante entender cuándo aplicar cada nivel:



  • debug — información detallada para desarrolladores (valores de variables, estado del sistema). Se desactiva en producción.
  • info — eventos normales de la aplicación (solicitud procesada, usuario registrado).
  • warn — situaciones potencialmente peligrosas (poca memoria disponible, API obsoleta).
  • error — errores que requieren intervención (excepciones, fallos de BD).


Ejemplo de uso correcto con la biblioteca Pino (la más rápida para Node.js):



const pino = require('pino');

const logger = pino({ level: process.env.LOG_LEVEL || 'info', transport: { target: 'pino-pretty', options: { colorize: true } }});

// Usologger.info({ userId: 123 }, 'Usuario inició sesión');logger.error(new Error('Error de conexión a la BD'), 'Error crítico');logger.debug('Valor de la variable x = 42'); // no se mostrará si level = 'info'


3. Registro estructurado: JSON y contexto



En lugar de cadenas de texto, use registros estructurados (generalmente JSON). Esto permite:



  • Analizar fácilmente los registros con herramientas (ELK, Graylog).
  • Agregar contexto (ID de solicitud, usuario, versión).
  • Filtrar y agregar datos.


Ejemplo de un registro estructurado con contexto:



const logger = require('./logger');

app.use((req, res, next) => { req.requestId = uuidv4(); next();});

app.get('/api/users', async (req, res) => { logger.info({ requestId: req.requestId, method: req.method, url: req.originalUrl, ip: req.ip }, 'Solicitud entrante');

try { const users = await getUsers(); logger.info({ requestId: req.requestId, count: users.length }, 'Usuarios obtenidos'); res.json(users); } catch (err) { logger.error({

Blogs

Book Recommendations