LogMonitor - Programando Un Sistema de Alertas para Logs Con Node - Js - Back End - Front & Back
LogMonitor - Programando Un Sistema de Alertas para Logs Con Node - Js - Back End - Front & Back
Front-end Back-end Laboratorio Contacto
A través del módulo “child_process” Node.js nos permite lanzar un proceso hijo, y mantener
un “stream” de datos por cada entrada o salida estándar del mismo (stdin, stdout y
stderror), de forma no bloqueante. Por su parte el método “spawn” de este módulo, nos
permite la creación de un proceso hijo mediante argumentos en línea de comandos.
Aprovechando esta particularidad he programado un pequeño sistema para el control de
logs; LogMonitor, que prácticamente acabo de subir a GitHub. La idea es acompañarlo en
versiones posteriores de un “GUI”, para monitorizar los datos recogidos en tiempo real,
aunque de momento su funcionamiento se limita a la escucha de logs y la realización de
acciones según unas reglas dadas, tal como muestra el grá co siguiente:
A través de un archivo de con guración se especi can los logs sobre los que necesitamos
una escucha permanente, relacionando cada uno de ellos con un “handler” donde se
almacenan las condiciones y acciones que queremos realizar con eventos concretos en cada
log.
Ahora tendremos que instalar los módulos necesarios para su funcionamiento; para ello
usaremos “npm”; el gestor de paquetes de Node.JS:
$ npm install emailjs #Para esta primera versión sólo necesitamos envío de emails
El siguiente paso sería renombrar el archivo con g.json_dist como con g.json e introducir
los datos de con guración de correo electrónico y logs a observar.
"logsToTail": [
{
"name":"_HERE_YOUR_LOG_NAME_",
"logFile":"_HERE_YOUR_LOG_FILE_PATH_",
"dataHandler" : "_HERE_YOUR_HANDLER_FILE_NAME_WITHOUT_JS_EXTENSION_"
}]
Si por ejemplo quisiéramos observar los logs “dev” y “prod” de Symfony2, nuestro
“logsToTail” podría tener el siguiente aspecto:
"logsToTail": [
{
"name":"xxx_dev",
"logFile":"/var/www/xxx/app/logs/dev.log",
"dataHandler" : "symfony2_example"
},
{
"name":"xxx_prod",
"logFile":"/var/www/xxx/app/logs/prod.log",
"dataHandler" : "symfony2_example"
}]
Cómo funcionan los handlers
Como hemos visto en el ejemplo anterior, los dos procesos resultantes de nuestra
con guración en “logsToTail” apuntan a un mismo handler “symfony2_example” cuyo código
comento a continuación:
//__construct recibirá los parámetros enviados en la creación del objeto y los “bindeará
symfony2.prototype.__construct = function(name, logger, config) {
this.name = name;
this.logger = logger;
this.emailjs = require('../../email.js');
this.emailjs = new this.emailjs(this.logger, config);
};
//handle es el método que se encargará de recibir los datos del proceso “tail -f” y real
symfony2.prototype.handle = function(data) {
//En este caso una condición para las salidas que contengan la palabra “CRITICAL
if(data.match("CRITICAL"))
{
this.logger.error('['+this.name+'] '+data); //Logueamos el error en el l
this.emailjs.send(data); //Enviamos un email
}
return null;
};
Como podemos ver, podríamos crear todo tipo de handlers; para monitorizar el log de PHP,
de Apache, etc, y crear distintas reglas o acciones para cada uno de ellos; bastaría con meter
nuestros handlers en el directorio handler/dataHandler y vincularlos a los logs que
corresponda en el archivo de con guración.
Lanzando la aplicación
var tails = new Array(); //El array que almacenará los procesos
var dataHandlers = new Array(); //El array que almacenará los handlers
/*APP*******************************************************/
dataHandlers[key] = require('./handler/dataHandler/'+config.logsToTail[key].data
dataHandlers[key] = new dataHandlers[key](config.logsToTail[key].name, logger, c
Node.js Javascript