Log4JS — Primeros pasos para unificar los logs de nuestros sistemas y aplicaciones

Dailos Rafael Díaz Lara
CanariasJS
Published in
3 min readAug 7, 2017

--

Cuando estamos desarrollando nuestras aplicaciones, ya sea del lado del cliente como del lado del servidor, una práctica bastante extendida es la de generar logs que nos proporcionen un determinado feedback de lo que está sucediendo en nuestro código.

Llega un momento en el que console.log, console.error y console.table empiezan a quedarse cortos. Es entonces cuando empiezas a echar en falta cierta normalización a la hora de escribir los logs, sobre todo si queremos empezar a usar herramientas como ELK, así como un determinado grado de configuración de manera que, por ejemplo, logs de debugging puedan estar presentes en el código del repositorio de nuestra aplicación pero que, por contra, cuando desplegamos a producción, dichos logs no aparezcan.

Una primera aproximación para lograr estos objetivos la podemos encontrar en la librería log4js, cuyas funcionalidades básicas vamos a cubrir a continuación.

Sistema de partida

El caso más claro que podemos tener cuando requerimos de un sistema de logs debidamente estructurado y cuyo uso va a ser realmente útil en un futuro, es cuando hablamos de un servidor de datos.

Para escenificar esta situación, vamos a coger como ejemplo, un servidor basado en NodeJS (v8.2.1), empleando Express como framework para implementar las peticiones REST.

De esta manera, la estructura del proyecto es la siguiente:

Arquitectura base del proyecto a emplear.

Como se puede apreciar en la imagen anterior, el núcleo de nuestra aplicación se encuentra en el directorio src, donde podemos encontrar un subdirectorio denominado config en cuyo interior, se han colocado los siguientes archivo:

Finalmente, tenemos el contenido del archivo server.js.

Al arrancar este servidor, lo único que tendremos será el típico mensaje de “feedback”…

Server running on port 4850 ...

Este es el sistema clásico de loging al que estamos habituados.

Primera aproximación a Log4JS

Vamos a ver cómo podemos mejorar la salida por nuestra consola.

Lo primero que haremos será importar y configurar el módulo log4js en nuestro servidor. Una vez hecho esto, ya podremos empezar a usar las propiedades de esta librería.

Como se puede apreciar el en script anterior, en las dos primeras líneas hemos incluido el módulo log4js y a continuación, creamos una instancia de este módulo.

Además de esto, como se puede apreciar, al emplear el método getLogger(), proporcionamos una cadena de caracteres cuya funcionalidad veremos enseguida.

Lo siguiente es definir el nivel mínimo de logging que vamos a admitir en nuestro servidor.

Finalmente, en el arranque del servidor, hemos sustituido el clásico conslor.log por la variable logger que acabamos de crear, e invocamos al método info, proporcionándole el mensaje que deseamos mostrar en nuestro log.

De este modo, ahora cuando arranquemos el servidor, el mensaje que obtendremos por la consola será el siguiente:

[2017–08–07 21:15:52.396] [INFO] server.js — Server running on port 4850 …

Como se puede apreciar, el contenido de este nuevo log nos proporciona mucha más información útil y un formato coherente para poder utilizar en nuestras aplicaciones.

Este es el formato estándar de mensaje de salida que nos ofrece Log4JS y como se puede apreciar, el primer bloque de información es el timestamp del momento en el que se produce el log. A continuación, vemos el tipo de mensaje del que se trata. Seguidamente aparecerá la cadena de caracteres que definimos en el método getLogger y que nos será muy útil para hacer la trazabilidad cuando queramos saber en qué archivo se está produciendo el log. Para conlcuir, tenemos la cadena de caracteres que hemos definido como mensaje de salida.

En próximas entradas abordaré configuraciones adicionales que puede admitir esta librería así como funcionalidades muy interesantes a la hora de plantear el mantenimiento de cualquier tipo de aplicación en Javascript.

--

--

Dailos Rafael Díaz Lara
CanariasJS

Multiplatform Software Developer seeking for new challenges