Un sistema informático suele encargarse de varias tareas a la vez. Por ejemplo, una aplicación e-commerce/e-businness se encarga principalmente de realizar ventas de productos y servicios online. Esto implica, a su vez, varios factores: mostrar a los clientes potenciales información actualizada y atractiva de los productos y servicios, brindar acceso a uno o varios medios de pago, efectuar una transacción segura con los servicios de bancos, ofrecer un servicio de envío/entrega del producto, enviar notificaciones sobre compras o promociones, ofrecer un canal de comunicación directa entre vendedor y cliente...

Sucediendo tantos factores necesarios para el funcionamiento de la aplicación, es necesario mantener un trackeo de los procesos que van ocurriendo, para tener a dónde acudir en caso de alguna falla, error o comportamiento inesperado y resolverlo.

Una de las herramientas que existen para este fin es la generación de logs en las partes de una aplicación donde quiera realizar un seguimiento/registro en específico. Pero... ¿Qué es un log? 

Un log es un registro donde se puede almacenar cronológicamente información específica relacionada a eventos que puedan suceder mientras un proceso se está ejecutando. Generalmente, es un archivo de texto que mantiene la trazabilidad de cada evento.

¿Qué información esperar de un log? 

En general, en cada log se permite especificar un nivel de error, una fecha y hora específicas y un mensaje donde detallar mayor información del evento registrado.

Los niveles de un log se han especificado en el RFC https://datatracker.ietf.org/doc/html/rfc5424, donde el sistema de syslog especifica el formato de su logging: en él, enumera 7 niveles de error, del 0 al 7, yendo de menor a mayor por nivel de severidad de un log: 

0 Emergency: system is unusable | 0 Emergencia: el sistema está obsoleto

1 Alert: action must be taken immediately | 1 Peligro: acciones deben tomarse inmediatamente

2 Critical: critical conditions | 2 Crítico: condiciones críticas

3 Error: error conditions | 3 Error: condiciones de error

4 Warning: warning conditions | 4 Advertencia: condiciones inesperadas

5 Notice: normal but significant condition | 5 Notable: condiciones normales pero significativas

6 Informational: informational messages | 6 Informativo: mensajes informativos

7 Debug: debug-level messages | 7 Detección de errores: mensajes para detectar o remover errores o defectos

Por ejemplo, al inicializar una aplicación de Spring Boot, podemos ver el siguiente log, donde informa que se inicializó el servidor Tomcat embebido.

2022-02-17 21:28:55.018 INFO 22308 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.30]

El formato de un log en Spring Boot por default tiene la siguiente estructura:

  • Fecha y hora: la fecha y la hora con precisión de milisegundos.
  • Nivel de log: ERRORWARNINFODEBUG, o TRACE.
  • El id del proceso.
  • Un -- separando la marca de tiempo del mensaje concreto.
  • Nombre de hilo: envuelto en corchetes.
  • La parte del programa que generó el log: suele ser el nombre de la clase donde está el logger.
  • El mensaje del log

Otro ejemplo es Winston, un framework de logging para aplicaciones Node, que, al crear el logger, se puede generar el log manteniendo el formato JSON, en este caso, solo especificando el mensaje y el nivel del log:

{"level":"info","message":"El cliente José Saavedra compró un estante de ébano. Quedan 3 estantes de ébano en stock."}

{"level":"error","message":"El servicio del banco está inhabiiltado."}

o configurarle un formato específico, como el siguiente, donde obedece la estructura:

${nivelDeLog}: ${categoria}: ${marcaDeTiempo}: ${mensaje}:

error: Label🏷️: Feb-17-2022 22:17:08: No se pudo conectar con el servicio del banco

Ahora... ¿Qué dicen los niveles de un log?

Si bien no hay un estándar de niveles de log, los más comunes son FATAL, ERROR, WARN, INFO, DEBUG, TRACE.

Los nombres de cada uno dan una idea de qué eventos mapean, a continuación se describen con más detalle:

TRACE: Es el más detallado nivel de log, donde se especifican el evento a trackear de la aplicación y también los que hayan sucedido en librerías de terceros.

DEBUG: Es menos detallado que el nivel de TRACE, solo hace un seguimiento del paso a paso de lo que está sucediendo en una aplicación, sin mucho más detalle.

INFO: Mantiene cierta información al respecto del evento, importantes para el entendimiento del proceso, no debería bloquearse, anularse o parar el funcionamiento normal de la aplicación. Por ejemplo, se espera este nivel de log a la consulta de un método de nuestros controllers, mostrando los parámetros esperados y el método que ejecuta.

WARN: Es parecido al nivel anterior, muestra eventos posibles que no esperamos que fueran a suceder en la aplicación y, sin embargo, no deberían detener o imposibilitar su funcionamiento. Por ejemplo, en el caso de la librería de PDFBox, librería de generación de archivos en formato de PDF para Java, genera logs con este nivel cuando no encuentra en el sistema operativo las fuentes default que usa para generar el pdf, lo que no impide la generación del pdf, pero si brinda información al respecto y sobre cómo quedaría el archivo final al no contar con esas fuentes.

ERROR: Mapea eventos donde ha sucedido algo que no permite a una o más funcionalidades de la aplicaciones funcionar como deberían o como se espera. 

FATAL: En este caso, el evento impide o detiene la aplicación por completo, o la ha dejado en un estado inconsistente del que no se puede salir sin intervención, inhibiendo el funcionamiento principal de la aplicación. Por ejemplo, que se haya perdido la conexión a una base de datos.

 

Podemos ver así la importancia de los logs en una aplicación y de cómo estén definidos, siendo que ofrecen valiosa información a la hora de localizar un error en su funcionamiento, fácilmente legible a la hora de resolver una urgencia. Además, también resulta importante tener en cuenta estos factores para luego incorporar Sistemas de Monitoreo de Logs, como ELK Stack (Beats, LogstashElasticsearch, Kibana). 

Mandanos tus sugerencias

Ayudanos con ideas para los artículos de este blog a contacto@somospnt.com

¡Seguínos en nuestras redes sociales para enterarte de los últimos posts!