• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Estadística
      • Calculadora del Tamaño Muestral en Encuestas
      • Calculadora de estadísticos descriptivos
      • Test de normalidad
      • Calculadora de contrastes de hipotesis
      • Calculadora de tamano del efecto
      • Simulador de Regresión Lineal con Ruido
      • Visualizador de PCA
      • Visualizador de Series Temporales
      • Simulador de Regresión Logística
      • Simulador de K-Means
      • Simulador de DBSCAN
      • Detector de la Ley de Benford
    • Probabilidad
      • Calculadora de Probabilidad de Distribuciones
      • Calculadora de Probabilidades de Lotería
      • Simulador del Problema de Monty Hall
      • Simulador de la Estrategia Martingala
    • Finanzas
      • Calculadora de Préstamos e Hipotecas
      • Conversor TIN ↔ TAE
      • Calculadora DCA con ajuste por inflación
      • Simulador FIRE (Financial Independence, Retire Early)
    • Herramientas
      • Formateador / Minificador de JSON
      • Comparador y Formateador de Texto y JSON
      • Formateador y Tester de Expresiones Regulares
      • Inspector de JWT
      • Generador y verificador de hashes
      • Codificador / Decodificador Base64 y URL
      • Conversor de bases numericas
      • Conversor de Timestamp Unix
      • Conversor de colores
      • Generador de UUIDs
    • Juegos
      • Tres en Raya
      • Nim con Q-Learning
    • Más
      • Método D’Hondt
      • Generador de Contraseñas Seguras
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

Agregando logs al API con Winston (6ª parte de creación de una API REST con Express y TypeScript)

noviembre 16, 2022 Por Daniel Rodríguez 1 comentario
Tiempo de lectura: 5 minutos

En las publicaciones anteriores se ha visto como configurar Express para la creación de una API y TypeORM para la conexión con una base de datos. Aunque con esto ya es suficiente para publicar un servicio, aún faltan algunos puntos clave, como la posibilidad de guardar logs. Algo que será clave a la hora de depurar y auditar el servicio. Aunque hasta ahora todos los mensajes se han sacado por pantalla con console.log(), es mejor usar una librería de logging como Winston para ello. Veamos los pasos necesarios para agregar logs al API con Winston. Además, también veremos como se puede usar dotenv para guardar en un sitio las opciones.

Esta entrada forma parte de la serie “Creación de una API REST con Express y TypeScript” de la cual forman los siguientes entregas:

  1. Creación de una API REST con Express y TypeScript
  2. Organizar el código del proyecto
  3. Configurar TypeORM para acceder a la base de datos
  4. Creación de rutas para consultar y agregar los registros
  5. Creación de rutas para modificar y borrar los registros
  6. Agregando logs al API con Winston
  7. Requerir autenticación mediante JWT
  8. Registro de usuarios
  9. Incluir un certificado en Express para servir el API mediante HTTPS
  10. Ejecutar la aplicación en producción con PM2

Tabla de contenidos

  • 1 Instalación de Winston
  • 2 Configuración de Winston
    • 2.1 Uso del logger
    • 2.2 Uso de Winston con Morgan
    • 2.3 Función para respuestas del API
  • 3 Archivo de configuración con dotenv
  • 4 Conclusiones

Instalación de Winston

Winston es una librería universal de logging para Node. Con ella se pueden crear uno o más logs en los que guardar registros de las operaciones realizadas. Como en el resto de las ocasiones es necesario instalar este paquete a través de npm, escribiendo para ello en la terminal

Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane
En Analytics Lane
Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane

npm install winston winston-daily-rotate-file

En este caso, además de Winston, también se instala la librería winston-daily-rotate-file con la se simplifica la tarea de rotar los archivos de log.

Configuración de Winston

Para la configuración de Winston se creará un archivo llamado logger.ts con el siguiente código.

import winston from 'winston';
import 'winston-daily-rotate-file';

const levels = {
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  debug: 4,
};

const colors = {
  error: 'red',
  warn: 'yellow',
  info: 'green',
  http: 'magenta',
  debug: 'white',
};

winston.addColors(colors);

const format = winston.format.combine(
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
  winston.format.colorize({ all: true }),
  winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)
);

const transports = [
  new winston.transports.Console(),
  new winston.transports.DailyRotateFile({
    filename: './logs/log-%DATE%.log',
    datePattern: 'YYYY-MM-DD',
    level: process.env.LOGGING_FILE_LEVEL || 'info',
    maxFiles: process.env.LOGGING_RETENTION || '30d',
  }),
];

const logger = winston.createLogger({
  level: process.env.LOGGING_LEVEL || 'info',
  levels,
  format,
  transports,
});

export default logger;

En este lo primero que se hace después de cargar las librerías es definir los diferentes niveles para los logs y sus colores asociados. Asignando estos mediante la propiedad addColors(). Usando cinco niveles, los que se corresponden los errores (error) en rojo, las advertencias (warn) en amarillo, otra información (info) en verde, información de las conexiones http en magenta y mensajes de depuración (debug) en blanco.

Posteriormente se define el formato con el que los logs se mostrarán por pantalla. Lo que se hace con el método winston.format.combine(). En este se indica un formato para las fechas, el uso de colores y el formato del mensaje.

Tras el formato se definirá donde se mostrarán los logs. Lo normal es mostrarlo en la consola y guardado en un archivo de logs para su posterior análisis. Los archivos se guardan con winston-daily-rotate-file en la carpeta logs, con un nivel de detalle que se puede determinar mediante la propiedad de entorno LOGGING_FILE_LEVEL y persistimos un hasta el tiempo indicado en la variable LOGGING_RETENTION. Si las variables no existen se usará por defecto el nivel 'info' y 30 días respectivamente.

Finalmente se crea el logger en sí con las opciones anteriores y se exporta.

Publicidad


Uso del logger

Una vez creado el logger para enviar un mensaje solamente se tiene que usar este con los métodos definidos en level. Esto es, en cualquier parte del código donde se importe el logger, simplemente se llama a este seguido del nivel y el mensaje como parámetro. Así para generar un error se debería usar:

logger.error('Mensaje de error');

Lo que mostrará en el archivo de log y por pantalla el un mensaje en rojo del estilo:

2022-11-01 00:00:00:00 error: Mensaje de error

Mientras que para un mensaje de depuración

debug('Mensaje de depuración');

Lo que, en caso de que el nivel de log sea debug mostrará un mensaje en blanco similar al siguiente

2022-11-01 00:00:00:00 debug: Mensaje de depuración

Ahora, en el código actual, se puede buscar todos apariciones de console.log() y reemplazar por logger.info().

Uso de Winston con Morgan

Como middlewares para sacar por pantalla información de las peticiones se usaba Morgan. Ahora en lugar de que el mensaje salga por la consola, se puede hacer que use este logger para guardar los mensajes en el archivo de logs cuando es necesario. Para esto debemos ir al archivo middlewares/index.ts, importar el logger y reemplazar la entrada actual de Morgan por esta

morgan('tiny', { stream: { write: (m) => logger.http(m.split('\n')[0]) } }),

Lo que hace que la información salga como un mensaje HTTP en el log.

Función para respuestas del API

Cuando se produce un error en el API se envía un mensaje con la información, este mensaje se puede enviar también al log para su depuración. Para ello se puede crear una función que permita simplificar esta operación. Por ejemplo, se puede agregar y exportar la siguiente función en logger.ts.

export function responseAndLogger(res: Response, message: string, status = 500): void {
  if (status >= 500) {
    logger.error(`${message} (${status})`);
  } else {
    logger.warn(`${message} (${status})`);
  }

  res.status(status).send({ message });
}

Cuando se envía un mensaje con un estado 5xx se guarda un mensaje de error, en caso contrario el mensaje se guarda como advertencia. Ahora simplemente se puede llamar a este método cuando sea necesario enviar un estado de error.

Publicidad


Archivo de configuración con dotenv

En el programa se están usado muchas variables de entorno para modificar el comportamiento. Valores que se pueden asignar a la hora de ejecutar Node de diferentes maneras, una de las formas más sencillas es usar el paquete dotenv para guardar en un archivo .env y leerlas nada al indicar el programa.

Para esto lo primero que hay que hacer es instalar dotenv ejecutando la siguiente línea en la terminal

npm install dotenv

Una vez hecho esto, en la primera línea del archivo index.ts donde se inicia el servidor se escribirá

import 'dotenv/config';

Es importante que sea la primera línea que se importa, ya que en el caso de que se importa antes de datasource.ts o logger.ts no se habrán cargado las variables de entorno. Usando por lo tanto los valores por defecto.

Ahora solo hay que crear un archivo de configuración en la raíz del proyecto con las opciones que se deseen modificar. Archivo que no debe agregarse al repositorio ya que puede contener información clave, como la que se agrega en la próxima entrada. Un ejemplo de este archivo puede ser el siguiente.

Conclusiones

En esta entrada se han visto los pasos necesarios para añadir opciones de logs al API con Winston. Una librería que nos da mucha flexibilidad a la hora de trabajar. Además se ha visto cómo usar dotenv para mover las opciones a un archivo de configuración. La semana que viene veremos cómo se puede crear un middeware para controlar el acceso a los datos, evitando que cualquiera pueda consultar cualquier petición.

El código creado en toda la serie de publicaciones se puede encontrar en la cuenta de GitHub de Analytics Lane.

Imagen de Tayeb MEZAHDIA en Pixabay

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane
  • Nueva calculadora de préstamos e hipotecas en el laboratorio de aplicaciones de Analytics Lane
  • Hardening avanzado de NGINX: CSP, OCSP Stapling y defensa en profundidad
  • Nuevo generador y verificador de hashes en el laboratorio de aplicaciones de Analytics Lane
  • Nueva simulación de la estrategia Martingala en ruleta en el laboratorio de aplicaciones de Analytics Lane
  • Exactitud, precisión, recall… y los errores que cometemos al interpretarlas en proyectos reales
  • Nuevo simulador del problema de Monty Hall en el laboratorio de aplicaciones de Analytics Lane
  • Nuevo simulador interactivo de K-Means en el laboratorio de aplicaciones de Analytics Lane
  • Por qué los chatbots de inteligencia artificial parecen estar siempre de acuerdo contigo – Conversar con una inteligencia artificial – Parte I

Publicado en: JavaScript Etiquetado como: Express, Node, TypeScript

Interacciones con los lectores

Comentarios

  1. Sebastian Guandique dice

    noviembre 17, 2022 a las 7:28 pm

    Me impresiona como las APIs permiten que los equipos informáticos manejen el trabajo automatizando la forma en la que se trabaja.

    Responder

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Nueva herramienta: Comparador y Formateador de Texto y JSON en el laboratorio de Analytics Lane

abril 21, 2026 Por Daniel Rodríguez

Chatbots vs redes sociales: la diferencia clave entre la inteligencia artificial y los algoritmos de recomendación – Conversar con una inteligencia artificial – Parte II

abril 21, 2026 Por Daniel Rodríguez

Nueva Calculadora de Estadísticos Descriptivos en el laboratorio de aplicaciones de Analytics Lane

abril 20, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Buscar en Excel con dos o más criterios publicado el septiembre 7, 2022 | en Herramientas
  • Gráfica con los datos y las anomalías detectadas con OneClass SVM One-Class SVM: Detección de anomalías con máquinas de vector soporte publicado el marzo 15, 2024 | en Ciencia de datos
  • Nueva herramienta: Comparador y Formateador de Texto y JSON en el laboratorio de Analytics Lane publicado el abril 21, 2026 | en Noticias
  • Método del codo (Elbow method) para seleccionar el número óptimo de clústeres en K-means publicado el junio 9, 2023 | en Ciencia de datos
  • Cómo desinstalar Oracle Database 19c en Windows publicado el noviembre 25, 2022 | en Herramientas

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.9 (11)

Pandas: Cambiar los tipos de datos en los DataFrames

Comentarios recientes

  • M. Pilar en Cómo eliminar las noticias en Windows 11 y recuperar tu concentración
  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • CARLOS ARETURO BELLO CACERES en Justicio: La herramienta gratuita de IA para consultas legales
  • Piera en Ecuaciones multilínea en Markdown

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2026 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto