• 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
    • Encuestas: Tamaño de Muestra
    • Lotería: Probabilidad de Ganar
    • Reparto de Escaños (D’Hondt)
    • Tres en Raya con IA
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad
    • Tiendas afiliadas
      • AliExpress
      • Amazon
      • Banggood
      • GeekBuying
      • Lenovo

Analytics Lane

Ciencia e ingeniería de datos aplicada

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

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

Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo
En Analytics Lane
Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo

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.

Publicidad


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.

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().

Publicidad


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?

Publicidad


Publicaciones relacionadas

  • Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo
  • ¿Está concentrado el MSCI World? Un análisis con Gini, Lorenz y leyes de potencia
  • Curiosidad: ¿Por qué usamos p < 0.05? Un umbral que cambió la historia de la ciencia
  • Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)
  • La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento
  • Cómo abrir una ventana de Chrome con tamaño y posición específicos desde la línea de comandos en Windows
  • Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte
  • Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)
  • Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato

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

Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato

octubre 23, 2025 Por Daniel Rodríguez

Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)

octubre 21, 2025 Por Daniel Rodríguez

Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte

octubre 16, 2025 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Aplicación web interactiva que muestra un mapa de Madrid con puntos de interés destacados, creado utilizando la biblioteca Folium. Tutorial: Creando un mapa interactivo con Folium en Python publicado el diciembre 13, 2024 | en Python
  • La Lotería: una perspectiva estadística publicado el diciembre 22, 2023 | en Opinión
  • Entendiendo la validación cruzada: Selección de la profundidad óptima en un árbol de decisión publicado el septiembre 13, 2024 | en Ciencia de datos
  • Buscar en Excel con dos o más criterios publicado el septiembre 7, 2022 | en Herramientas
  • Aprovecha un 40% de descuento en Coursera Plus para impulsar tus habilidades en Ciencia de Datos e Inteligencia Artificial publicado el noviembre 9, 2024 | en Noticias, Reseñas

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.5 (10)

Diferencias entre var y let en JavaScript

Publicidad

Comentarios recientes

  • 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
  • Daniel Rodríguez en Tutorial de Mypy para Principiantes

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-2025 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto