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 :
- Retrouver la requête à l’origine d’une erreur 8623 “The query processor ran out of internal resources and could not produce a query plan” (David Baffaleuf) [SQL Server]
- Msg 2508, Level 16, State 1: the In-Row data %% for object %% is incorrect (David Baffaleuf) [SQL Server]
- MySQL & Performance Schema : mais où sont passés les compteurs Com_% ?? (David Baffaleuf) [MySQL]
- Nouveautés MySQL 8.0 : Configuration automatique de variables avec innodb_dedicated_server (Capdata team) [MySQL]
- Pourquoi il faut sauvegarder les bases systèmes (David Baffaleuf) [SQL Server]
Un commentaire