Monitorizando el log del TaskScheduler de un Windows 2000

whyAfortunadamente en versiones más actuales de Windows tenemos la posibilidad de consultar los errores en la ejecución de tareas programadas a través del propio visor de eventos, lo que facilita enormemente las cosas si necesitamos crear un monitor en HPOM.

En Windows 2000 sin embargo alguna mente perversa tuvo la desquiciada idea de que los resultados de estas tareas se almacenasen en un log de texto plano (hasta aquí todo correcto) dividiendo cada entrada en varias líneas.

Entiendo que en el mundo Windows la cultura de parseo de ficheros de log es más o menos inexistente, pero crear un log con este formato es directamente estúpido.

Ante la tesitura de tener que enfrentarme a este despropósito, perl al rescate.

#!/usr/bin/perl
use strict;
use warnings;

sub trim($)
{
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}

sub mydate()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;
$year += 1900;
my $fmday = '';
my $fmon = '';
if ($mday < 10) {
$fmday = "0" . "$mday";
} else {
$fmday = "$mday";
}
if ($mon < 10) {
$fmon = "0" . "$mon";
} else {
$fmon = "$mon";
}
my $currentdate = "$fmday/$fmon/$year";
return $currentdate;
}

my $prevline="";
open FILE, "c:\WINNT\SchedLgU.txt" or die $!;
open FILEOUT, ">c:\WINNT\TEMP\SchedLgU.log" or die $!;

my $todaydate=mydate();

while (my $line = <FILE> ) {

my $char = substr(trim($line),0,1);
if ($char eq "\"") {
if ($prevline ne "") {
my $resindex = index($prevline,"$todaydate");
if ($resindex != -1) {
print FILEOUT "$prevline\n";
}
}
$prevline=trim($line);
} else {
$prevline.=" " . trim($line);
}
}
my $resindex = index($prevline,"$todaydate");
if ($resindex != -1) {
print FILEOUT "$prevline\n";
}
close FILEOUT;
close FILE;
print "c:\WINNT\TEMP\SchedLgU.log";

Lo que hace este script es generar un copia del fichero de log en un directorio temporal, uniendo todas las líneas que no comienzan por el caracter ” y que por tanto pertenecen a la misma entrada de log.

¿Y por qué termino el script haciendo un print del archivo de log generado? Porque así puedo colocar el script en el campo Logfile de un monitor de HPOM, y el valor devuelto tras la ejecución será el archivo de log del que se hará el matcheo de las condiciones que defina para generar alertas.