registros de eventos en Node JS: ¿cómo crearlos?

registros

Creación de registros de eventos en Node JS

Registros — Comprender los registradores y cómo registrar eventos en Node JS y Express


Los registros de eventos son una parte integral de las aplicaciones de back-end o sistemas, estos registros ayudan a rastrear errores, solicitudes, etc. Cuando los registros están organizados correctamente, será muy fácil rastrear el error que rompió el servidor, y la mayoría de las veces se debe a errores no manejados.

Es muy fácil olvidar el manejo de errores ya que puede romper la aplicación en la parte menos esperada. La parte culpable son las consultas de la base de datos, pero si se fija en esta parte, es posible que se olvide de otras.

En Essence, si registra correctamente los eventos que ocurren en la aplicación, y cada parte tiene un archivo específico donde se informan las ocurrencias, pasará menos tiempo depurando su aplicación.

A veces, necesitará más de un archivo de registro para detectar los problemas, por lo que es bueno tener registros estratégicos, por ejemplo, un archivo para solicitudes con un registro de fecha y hora le indicará qué solicitud se realizó cuando ocurrió el error.

Pasemos al código, espero que tenga algo de experiencia con Node y Express

Instalaremos dos módulos externos, ‘date-fns’ es una biblioteca de utilidades de JavaScript para manipular el tiempo. Sugiero consultar y leer la documentación, ya que está repleto de excelentes herramientas. El ‘uuid’ es un identificador único universal para crear ID para asignar elementos individuales con un alto nivel de certeza de que siempre será único. Esto es bueno para que cada registro creado se pueda identificar de forma única en un caso de referencia.

Inicialice su aplicación de nodo. Ejecute lo siguiente para instalar ambos módulos.

npm install --save date-fns uuid

Luego, importemos los módulos instalados, para que el siguiente código funcione correctamente, asegúrese de que la función se llame en un subdirectorio, un directorio dentro del directorio inicializado, si no, el módulo FS creará los directorios de registro fuera de su directorio de trabajo, pero si desea ejecutarlo en el directorio base, puede incluir su directorio base en el método ‘mkdir’. Lo explicaré mejor a medida que avancemos. Si está utilizando Common JS, use lo siguiente

const { format } = require('date-fns');

const { v4: uuid } = require('uuid');

const fs = require('fs');

const fsPromises = require('fs').promises;

const path = require('path');

Si está utilizando ESM, puede utilizar lo siguiente

import { format } from 'date-fns';

import { v4: uuid } from 'uuid');

import fs from 'fs';

import path from 'path';

const fsPromises = fs.promises;

Incluimos el módulo de ruta que está integrado y ayuda a trabajar con los directorios. Estamos usando la versión 4 de ‘uuid’, es la última y mejor versión disponible en este momento. El método de formato fue desestructurado del módulo FS, porque solo usaremos el método de formato para formatear nuestra estructura de fecha/hora.

const logEvents = async (message, logName) => {

const dateAndTime = `${format(new Date(), 'yyyyMMdd\tHH:mm:ss')}`;

const logInfo = `${dateAndTime}\t${uuid()}\t${message}\n`;

}

Una función asíncrona con dos parámetros para el mensaje y logName.

La variable dateAndTime da formato a la fecha y hora exactas en las que se llamó al método logEvents, utilizando el formato del módulo date-fns.

logInfo une el mensaje, la fecha y la hora y el uuid en una sola cadena mediante literales de plantilla.

const logEvents = async (message, logName) => {

const dateAndTime = `${format(new Date(), 'yyyyMMdd\tHH:mm:ss')}`;

const logInfo = `${dateAndTime}\t${uuid()}\t${message}\n`;

try {

if (!fs.existsSync(path.join(__dirname, '..', 'event_logs'))) {

await fsPromises.mkdir(path.join(__dirname, '..', 'event_logs'));

}

await fsPromises.appendFile(path.join(__dirname, '..', 'event_logs', logName), logInfo);

} catch (err) {

console.log(err);

}

}
//CommonJS
module.exports = {
logEvents
}
or
//ESM
export default logEvents

Agregamos un bloque try/catch a porque fsPromises realiza llamadas asincrónicas y debe tener el prefijo con la palabra clave await, por lo que la función se resuelve antes de progresar.

¿Qué está haciendo el código?

Usamos la declaración if para verificar si ya existe el directorio donde guardaremos nuestros archivos; si no, lo creamos, pero si existe, salteamos el bloque if y agregamos nuestro archivo al directorio.

El bloque catch detecta el error, podemos hacer lo que queramos con el error, pero si lo configuramos correctamente en el desarrollo, difícilmente obtendremos ningún error en producción. Luego exportamos la función.

La razón por la que necesita su archivo logger.js en una subcarpeta o directorio es porque usar la ruta es complicado path.join(__dirname, ‘..’, ‘event_logs’, logName), se encontrará en el directorio principal del directorio actual , y path.join(__dirname, ‘.’, ‘event_logs’, logName) se encontrarán en el directorio actual.

La diferencia es el segundo argumento pasado al método path.join, usé los puntos dobles como en ‘../’ porque a medida que la aplicación crece, es ideal tener su método de registro en un subdirectorio.

Puede hacer su propia investigación sobre todos los módulos utilizados aquí para comprenderlos mejor.

Finalmente, para usar el método, puede importar el archivo de registro en otras partes de su aplicación para registrar lo que quiera.

const { logEvents } = require("./logger");

const func = async () => {

try {

await Users.find();

} catch (error) {

await logEvents(error, 'users');

}

}

Lo anterior muestra cómo usar simplemente el registrador.

Gracias por ceñirse a este punto, espero que esto haya podido ayudarlo a comprender los registradores en Node JS.

¡FELIZ CODIFICACIÓN!


Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre Laravel:

Recent Post