Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre un paquete base de node.js.

Anuncios

Este paquete se encarga principalmente del registro o logging de nuestra aplicacion, cuando nos referimos al registro de la aplicacion estamos hablando de todas las actividades en esta tales como:

  • Actividad normal de la aplicacion
  • Errores de la misma
  • Informacion de depuracion
Anuncios
Anuncios

Y algunas otras informaciones mas que nos pueden ser utiles para llevar una mejor comprension de como trabaja nuestra aplicacion sino tambien ante algun eventual error o conducta extraña de nuestra aplicacion, pero llevar un registro de nuestra aplicacion tambien implica que nos puede derivar en un inconveniente o issue, este comenzara a ocupar espacio en el disco rigido reduciendo capacidad a nuestro equipo pero para solucionarlo podemos usar varias practicas como son la rotacion (mover el archivo o los archivos a otro directorio y crear uno nuevo), respaldo de este movimiento en otro dispositivo o bien almacenarlo en un equipo destinado para eso, pero como mencionamos no solamente es para ver posibles errores sino tambien para obtener cierta informacion como:

  • La cantidad de trafico que maneja nuestra aplicacion
  • Si es un sitio web, saber cual es la pagina mas visitada
  • Cuantos errores ocurren y de que tipo
  • Si recibimos cyberataques
Anuncios
Anuncios

Al margen de los errores y los posibles ataques que podemos recibir tambien nos sirve para saber si nuestra infraestructura es suficiente para la cantidad de trafico para nuestra aplicacion/sitio web, en nuestro caso toda esta informacion nos la muestra el paquete morgan, tomemos la aplicacion Notas si vamos al archivo app.mjs tendremos primero esta linea:

import { default as logger }  from 'morgan';
Anuncios

Esta sera la encargada de importar el paquete, y mas adelante tendremos esta linea:

app.use(logger('dev'));
Anuncios
Anuncios

Donde la implementaremos con el formato dev y basicamente es la encargada de mostrarnos todos los requests de tipo HTTP que hacemos en la aplicacion, a su vez tenemos los rastros (traces) de depuracion donde obtendremos mas informacion pero estos en general deberian ser silenciados y solo deberian ser usados cuando se muestra la informacion o se puede configurar, para Express se usa el paquete debug y este se habilita mediante la variable de entorno DEBUG, la cual ya hemos implementado desde el inicio en la seccion scripts de package.json, pero tambien tendremos excepciones sin capturar (uncaughtException) y promesas sin manejar (unhandledRejection) y estos deben ser capturados.

Anuncios

Con todo esto comentado podemos comenza a hablar sobre el paquete morgan, este se encarga de generar nuestros archivos de registro o log y en ellos guardaremos principalmente todo el trafico HTTP que llegue a la aplicacion, tenemos dos tipos de area de registro:

  • Formato del log
  • Ubicacion del log
Anuncios
Anuncios

Como mencionamos anteriormente nuestra aplicacion Notas lo utiliza mediante el formato dev, este es un estado de salida conciso para desarrolladores y nos sera util tanto para llevar un registro de las solicitudes asi como tambien una forma para medir la actividad y popularidad del sitio, por ejemplo el formato de log de Apache posee un gran ecosistema de herramientas de reporte y podemos lograr que morgan genere archivos de log con este formato, para entender el concepto vamos a trabajar con nuestra aplicacion y para ello necesitaremos nuestra aplicacion Notas sino la poseen les dejo un link para descargarlo:

Anuncios

Una vez descargado simplemente extraigan el directorio en el PC y ya esta listo para usarse, nuestro primer paso sera ir al archivo app.mjs y buscaremos la siguiente linea:

app.use(logger('dev'));
Anuncios

Y lo modificaremos de la siguiente manera:

app.use(logger(process.env.REQUEST_LOG_FORMAT || 'dev'));
Anuncios

En este caso le pasamos una variable del entorno que usaremos para trabajar sino tendremos un valor predeterminado en caso no pasarlo, en este caso seguira como antes, por lo tanto ahora al momento de ejecutarlo debemos hacerlo de la siguiente manera:

$ REQUEST_LOG_FORMAT=common npm start
Anuncios

Ahora al momento de ver nuestro log de conexion de la aplicacion tendremos esta linea:

  morgan log request +6ms
::ffff:172.128.51.19 - - [29/Nov/2023:19:34:51 +0000] "GET /assets/vendor/feather-icons/feather.js HTTP/1.1" 304 -
Anuncios

Obseven que es la del paquete morgan pero si la comparan con la ejecucion normal de la aplicacion veran que es mucho mas completa, si van a la documentacion de morgan veran que tenemos varios formatos disponibles pero nosotros nos centraremos en dos como son:

  • common
  • dev
Anuncios

Siendo common mas completo que dev dado que este ultimo esta pensado para los desarrolladores, esta salida la vemos mediante stdout y si bien podemos capturarlo mediante otro proceso es mas recomendable hacerlo mediante morgan, si nos referimos al manual de morgan este nos recomienda lo siguiente para trabajar con un archivo:

const logStream = fs.createWriteStream(`${__dirname}/registro.log`, {flags: 'a'});
app.use(morgan('combined', {stream: logStream}));
Anuncios
Anuncios

La primer linea sera la encargada de crear un objeto que sera el archivo donde almacenaremos todos los registros de nuestra aplicacion, en la siguiente estableceremos el registrador para almacenarlo si bien esto funcionaria perfectamente pero tiene un pequeño inconveniente, no se podra realizar la rotacion ya que tendremos que finalizar nuestra aplicacion, realizarla y luego reiniciar la aplicacion, esto es debido a que morgan al abrir al archivo lo vuelve inaccesible y no podemos trabajarlo desde afuera.

Anuncios

Si se preguntan como podemos hacerlo debemos recurrir a otro paquete llamado rotating-file-stream, el cual nos permitira automatizar esta tarea, para ello lo primero que debemos hacer es ejecutar el siguiente comando en el directorio notas:

$ npm install rotating-file-stream --save
Anuncios

Este nos instalara el paquete que necesitamos dentro del directorio node_modules y podamos accederlo desde nuestro codigo, nuestro siguiente paso sera ir al archivo app.mjs y en la parte superior donde importamos todos los paquetes agregaremos la siguiente linea:

import { default as rfs } from 'rotating-file-system';
Anuncios

Esta se encargara de importar el paquete o modulo y lo asignarmos al objeto rfs, nuestro siguiente paso sera ir a la linea de logger que modificamos anteriormente y la cambiaremos de la siguiente forma:

app.use(logger(process.env.REQUEST_LOG_FORMAT || 'dev', {
        stream: process.env.REQUEST_LOG_FILE ?
                rfs.createStream(process.env.REQUEST_LOG_FILE, {
                        size: '10M',
                        interval: '1d',
                        compress: 'gzip'
                })
                : process.stdout
        })
);
Anuncios
Anuncios

Aqui mantenemos el formato que establecimos al inicio pero ahora le agregamos el stream que usaremos para procesarlo, para establecer el valor del stream usaremos un operador condicional donde verificamos si REQUEST_LOG_FILE tiene un valor, en caso de ser verdadero procede a crear un archivo mediante createStream con el nombre pasado en la variable y estableceremos tres propiedades:

  • size, establece el tamaño del archivo con el cual rotara una vez alcanzado
  • interval, este establece cada cuantos dias se realizara la rotacion en caso de no alcanzar el tamaño establecido
  • compress, indica con que engine se comprimira el archivo rotado
Anuncios

Y en caso de no informar un valor en la variable procedera a mostrarlo mediante la salida predeterminada stdout, por lo general es el monitor pero se puede modificar, con esto ya tenemos todo listo para hacer nuestra primer prueba y para ello ahora deberemos ejecutarlo de la siguiente manera:

$ REQUEST_LOG_FILE=notas.log REQUEST_LOG_FORMAT=common DEBUG=notas:* node ./app.mjs
Anuncios

Con todo lo comentado anteriormente primero pasaremos la variable que tendra el nombre del archivo, REQUEST_LOG_FILE, luego la otra variable, REQUEST_LOG_FORMAT, pero en este caso en lugar de usar a npm start le pasamos la linea que utiliza, en este caso con la variable de entorno DEBUG y el archivo a llamar, si lo ejecutaran quedara de la siguiente forma:

$ REQUEST_LOG_FILE=notas.log REQUEST_LOG_FORMAT=common DEBUG=notas:* node ./app.mjs
Escuchando en port 3000
Anuncios

Si miramos en el directorio de la aplicacion veremos que existe un archivo llamado notas.log, en este se almacenan todos las solicitudes que se realizan, les paso un ejemplo del generado en mi caso:

::ffff:172.128.51.19 - - [29/Nov/2023:21:18:30 +0000] "GET / HTTP/1.1" 304 -
::ffff:172.128.51.19 - - [29/Nov/2023:21:18:30 +0000] "GET /assets/vendor/bootstrap/css/bootstrap.css HTTP/1.1" 304 -
::ffff:172.128.51.19 - - [29/Nov/2023:21:18:30 +0000] "GET /assets/stylesheets/style.css HTTP/1.1" 304 -
::ffff:172.128.51.19 - - [29/Nov/2023:21:18:30 +0000] "GET /assets/vendor/jquery/jquery.min.js HTTP/1.1" 304 -
::ffff:172.128.51.19 - - [29/Nov/2023:21:18:30 +0000] "GET /assets/vendor/popper.js/popper.min.js HTTP/1.1" 304 -
::ffff:172.128.51.19 - - [29/Nov/2023:21:18:30 +0000] "GET /assets/vendor/bootstrap/js/bootstrap.min.js HTTP/1.1" 304 -
::ffff:172.128.51.19 - - [29/Nov/2023:21:18:30 +0000] "GET /assets/vendor/feather-icons/feather.js HTTP/1.1" 304 -
Anuncios

Con esto tenemos una base para los registros de nuestra aplicacion y no solamente verlos en pantalla sino para hacerles un posible seguimiento, esto debemos hacerlo asi porque proximamente trabajaremos en como almacenar las notas de manera permanente y no como hasta ahora solamente en memoria, antes de finalizar les dejo un link con todos los archivos del proyecto y los trabajados en este post:

Anuncios

En resumen, hoy hemos visto al paquete morgan, para que sirve, como se utiliza, como pudimos modificar su implementacion lo suficiente para primero mostrar mas datos y luego para poder almacenarlo en un archivo, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50