Logs para aplicaciones javascript con persistent-log

Al final, nos guste más o menos, la última línea de soporte es el programador y cuando una aplicación entra en producción, antes o después nos tocará resolver los problemas que vayan surgiendo. Para ello, es importante contar con la ayuda del usuario y haber preparado esas otras aplicaciones que nos permitirán resolver el problema sin sufrir demasiado.

Pero sin duda, lo más importante para poder resolver un problema es poder diagnosticarlo y para eso una de las herramientas más útiles es un buen log que nos ayude a entender lo que está ocurriendo. Generar un buen log tiene su arte y da para otro post, en éste vamos a centrarnos en una librería que nos permite generar logs en aplicaciones cliente desarrolladas con javascript: persistent-log.

Log en clientes javascript

Lo primero que debemos plantearnos es, ¿tiene sentido generar un log en una aplicación desarrollada en javascript para un navegador? Hace unos años (no muchos) hubiera dicho que no, pero hoy en día la complejidad de las aplicaciones javascript ha crecido mucho y los problema que surgen en producción no siempre son fáciles de reproducir.

Antes bastaba con tener una buena gestión de errores en la parte de servidor (librerías como ELMAH vienen muy bien para eso) puesto que era donde residía casi toda la complejidad, pero ahora es interesante poder tener también un registro de lo que está pasando en la parte cliente.

La opción más simple es utilizar console.log(), pero esto tiene una limitación muy importante: el log no se mantiene entre sesión y sesión. También podríamos enviar los mensajes al servidor y loggearlos allí, pero eso implica un mayor tráfico de red (algo bastante malo si estamos hablando de dispositivos móviles) y una mayor carga en el servidor.

Usando persistent-log

persistent-log es una librería de logging para javascript que almacena los mensajes de log de forma persistente usando localStorage. De estas forma podemos recuperar posteriormente los eventos almacenados y hacer con ellos lo que creamos oportuno, como mostrarlos en pantalla, enviarlos a un servidor, etc.

Para utilizar persistent-log necesitamos incluir el script plog.js en nuestra página. Una vez hecho esto, podremos comenzar a configurar y usar persistent-log:

// Creamos el almacenamiento. De momento el único almacenamiento persistente es 
// LocalStorage, pero es fácil definir alternativas basadas en WebSQL, IndexedDB, etc.
var storage = new plog.storages.LocalStorage({maxSize: 200})

// Configuramos plog para que use el almacenamiento que acabamos de crear
plog.useStorage(storage);

// Establecemos el nivel de detalle que queramos entre DEBUG, INFO, WARN, ERROR, FATAL
plog.setLevel(plog.level.INFO);

// Escribimos mensajes en el log
plog.debug('debug message');
plog.info('info message');
plog.warn('warn message');
plog.error('error message');
plog.fatal('fatal message');

// Cuando queramos, podemos recuperar los mensajes que se han añadido al log
var events = storage.getEvents();

Cada mensaje añadido al log es almacenado como un evento con la siguiente información:

{
  level: 0, // 0 - DEBUG, ..., 3 - FATAL
  message: 'some message',
  date: '2013-12-31T12:04:32.283Z'
}

Información técnica

Si alguien tiene curiosidad y le quiere echar un vistazo al código fuente de persistent-log verá que no tiene demasiada complicación. Lo más interesante (al menos para mi) es el uso que se hace de distintas herramientas basadas en node.js para desarrollar una librería para el lado cliente.

Entre ellas, encontramos grunt para gestionar todo el proceso de compilación, browserify para generar la librería final a partir de un sistema basado en módulos o karma para lanzar los tests. Además, se utiliza travis-ci como servidor de integración continua.

El proyecto es lo bastante simple como para que se entienda bastante bien el uso de estas herramientas, por lo que es una buena oportunidad para aprender. Si quieres comprobar cómo es la vida fuera del Visual Studio, te recomiendo que pruebes a compilar persistent-log. No digo que sea mejor o peor forma de trabajar, pero es interesante conocerla.

Conclusiones

Esta claro que una librería de estas características no es algo que merezca la pena usar en todos los casos. Si la aplicación que estás desarrollando no tiene mucha complicación en la parte cliente y se limita a enlazar un par de plugins de jQuery, seguramente no merezca la pena.

Por el contrario, si tienes una aplicación compleja, pensada para un uso profesional, sobre la que tienes que garantizar un soporte y no vale sólo con decirle al usuario «recarga la página y ya está», usar una librería de estas características puede ser muy útil.