1

Scruter les journaux d’évènements Windows avec LogParser

twitterlinkedinmail

Un petit post sur un outil bien pratique pour tous ceux qui rament pour écrire des scripts sous Windows. Un des outils indispensables dont toute production doive se doter est un analyseur de journaux d’erreur.

Logparser est un petit exécutable fourni gratuitement par Microsoft et qui permet de lire des fichiers structurés propriétaires tels que les eventlogs *.EVT, mais aussi les fichiers CVS, ETW, REG, etc… Tout d’abord il s’agit de le télécharger et de l’installer en trois ou quatre clics. Je passe rapidement sur l’install, il faudra juste bien penser à ajouter le chemin de logparser.exe dans votre PATH.

L’avantage principal est qu’il utilise un pseudo langage proche du SQL pour effectuer des recherches. Par exemple, si je veux remonter les 3 dernières erreurs dans le journal Application :

$ logparser "SELECT TOP 3 TimeGenerated, SourceName, Message
from Application
where eventtype=1
order by TimeGenerated desc" -i:EVT -stats:OFF
TimeGenerated           SourceName      Message
-------------------     -----------     ------------------------------------------------
2010-03-11 13:03:39     MSSQLSERVER     Database mirroring connection error 2 'Connection ...
2010-03-11 13:03:17     MSSQLSERVER     Database mirroring connection error 4 '64...
2010-03-11 13:02:57     MSSQLSERVER     The mirroring connection to "tcp://192...

On peut utiliser le mot-clé ‘into‘ après le SELECT pour indiquer que l’on souhaite placer le résultat dans un fichier. La répartition des codes erreurs dans les journaux d’évènements se fait comme suit:

$ logparser "select distinct EventTypeName, EventType
from Application" -i:EVT -stats:OFF

EventTypeName       EventType
------------------- ---------
Information event   4
Success event       0
Warning event       2
Error event         1
Failure Audit event 16

On recherchera donc en priorité les eventtype = 1.

Parmi les options intéressantes:

-i: Donne le type d’entrée du fichier. exemple, -i:EVT indique que l’on souhaite lire un fichier *.evt. S’il n’est pas indiqué, logparser le trouve tout seul en fonction de l’entrée.
-o: Donne le format de sortie. Par exemple -o:XML pour écrire au format XML. S’il n’est pas indiqué, logparser le trouve tout seul en fonction du fichier indiqué dans la clause ‘into‘.
-stats: ON/OFF: si les stats sont indiquées, alors logparser renvoie le nombre de lignes traitées et le temps passé.
-q: ON/OFF: mode quiet, par exemple pour éliminer les entêtes.

Il possède également des fonction d’agrégation de type GROUP BY / HAVING… Par exemple pour ramener le nombre d’erreurs par Source:

$ logparser "SELECT SourceName, count(*)
from Application where EventType = 1
group by SourceName order by count(*) desc"
-i:EVT -stats:OFF

SourceName                        COUNT(ALL *)
--------------------------------- ------------
MSSQLSERVER                       83
Winlogon                          30
Software Licensing Service        2
Perflib                           2
.NET Runtime Optimization Service 2
SideBySide                        2
SQLDIAG                           1

Dès lors il devient facile de créer un script qui va régulièrement exécuter une recherche des erreurs remontées dans les journaux Application et System. Nous pouvons utiliser un simple fichier par exemple pour stocker la dernière ligne lue à chaque passage, et nous permettre de repartir de cette ligne à l’exécution suivante:

$ logparser "SELECT MAX(RecordNumber) into E:\maxrecod.app.log FROM Application"
-i:EVT -stats:OFF -q:ON
$ cat E:/maxrecod.app.log
3597

… et dans un script, affecter le contenu du fichier dans une variable, et utiliser la variable dans une nouvelle recherche. Par exemple sous cygwin:

MAXRECORD=$(cat E:/maxrecod.app.log)
if [ ! -z ${MAXRECORD} ]
then
      logparser "SELECT TimeGenerated, SourceName, Message into E:/Application.err
      from Application where EventType=1 and RecordNumber >= ${MAXRECORD}" 
      -i:EVT -stats:OFF -q:ON
else
      echo "borne invalide"
fi

A+. David  B.

 

Continuez votre lecture sur le blog :

twitterlinkedinmail

David Baffaleuf

Un commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.