Monitorizar eventos con PowerShell

En una entrada anterior de este blog, se describía un sencillo sistema con el que monitorizar el espacio libre en los discos de un sistema. Esto ayuda a prevenir problemas como que un servidor de máquinas virtuales se quede sin espacio prematuramente, lo que provoca un bloqueo total de todos los sistemas virtualizados.

Montar un sistema de notificaciones push para un sencillo script que vigila el espacio libre en disco puede parecer un poco overkill para la situación, así que… ¿Por qué no intentar exprimirlo un poco mas? Siguiendo en la línea de monitorizar de un servidor hay una parte que es especialmente útil, sobre todo para diagnosticar problemas: El visor de eventos.

Se abre el telón: Get-EventLog

Este pequeño cmdlet se encarga de leer los eventos del sistema, permitiendo además capacidades de filtrado para poder obtener aquellos que sean de interés para el usuario. La forma más básica de usarlo es invocándolo con el parámetro “-list” ,  que devuelve un listado de todos los logs que se pueden consultar.

Para consultar un log en concreto, se usa “Get-EventLog –LogName <nombreLog>”, donde nombreLog puede ser, por ejemplo “Application” o cualquier otro valor devuelto por la opción “-list”. Además de consultar un log determinado, se puede filtrar de varias formas diferentes, como por ejemplo con el parámetro “-newest <cifra>”, para recoger los últimos cifra eventos registrados en el sistema, o el parámetro “-entrytype <tipo>” para filtrar la respuesta por los siguientes tipos: Error, FailureAudit, Information, SuccessAudit o Warning. Cada uno de estos tipos se corresponde con los tipos que se pueden encontrar en el Visor de Eventos.

Juntando las piezas

Se tiene un sistema para enviar notificaciones, se tiene algo que se desea monitorizar, se tiene una forma de acceder a lo que se quiere vigilar, y se tiene un temporizador con el que invocar todo automáticamente. Con estas cuatro piezas, ya es posible montar un sistema que vigile los eventos generados en el sistema. En este caso, el script solicita los eventos de error guardados en el log “Application”, que se hayan generado en la última hora.

El resultado

Ejecutar este script, genera la siguiente salida en PowerShell (el resultado obviamente cambiará en función del momento y del equipo utilizado).

resultShell

Y como no podía ser de otra forma, slack recibe la notificación directamente desde el script PowerShell. En entornos en los que sea necesario vigilar específicamente una aplicación se pueden hacer filtrados adicionales, no ya a nivel de consulta de Get-EventLog, sino utilizando el famoso Where-Object para filtrar, por ejemplo, por una subcadena del mensaje de error que resulte de especial interés.

slack

Finalmente, y al igual que el script de monitorización de discos del que ya hablamos antes, se puede crear una tarea programada periódica que compruebe el registro de eventos en busca de errores.

Conclusiones

Como se ha visto en el código, se pueden pedir los eventos para la última hora, o para cualquier intervalo de tiempo. Teniendo en cuenta que consultar el registro de eventos puede ser una operación costosa (dependiendo del número de eventos se esté consultando), sería deseable que el intervalo mínimo de consulta de eventos sea una hora, en vez de unos pocos minutos, cuando se está consultando un log que tenga un tamaño apreciable.

Una alternativa interesante consiste en programar un trigger de la tarea programada para que se dispare con un evento, en vez de a un intervalo prefijado. De esta forma, si se tiene conocimiento sobre el tipo de evento que se quiere vigilar, se puede obtener la notificación push prácticamente en el momento en el que se lanza el evento. Esto se puede ver más claramente en la siguiente captura de pantalla. Aunque en este caso, cabe la posibilidad de usar un script mucho más específico, que mande la notificación push adecuada, sin tener que entrar a leer los eventos del registro, filtrarlos, y generar el mensaje automatizado.

newTrigger

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *