Compteur log

Résolu
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008 - 21 oct. 2007 à 21:39
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008 - 26 oct. 2007 à 15:50
Bonjour,

Pourriez-vous m'aider à écrire un script VBS pour lire le fichier log d'un serveur Windows :
-lecture de 10 dernières minutes du fichier en cherchant un mot par ex "busy" et compter si il apparait combien de fois
- si il apparait au moins une fois, ne rien  faire par contre si aucune apparition, remonter un message d'erreur.

14 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
26 oct. 2007 à 14:26
 Bonjour,

'Lecture du tableau de la fin jusqu'au début
cpt= 0
For i=UBound(Fic) To 1 Step -1
    'Vérification que les 16 premiers caractères de la ligne
    'courante soient de type Date
    If IsDate(Left(Fic(i),16)) Then
      'au 1er passage dans la boucle For...Next, on initialise
      'la variable DateDebut dans laquelle on met les 16
      'premiers caractères de gauche de la dernière ligne
      'du tableau ex: 13/10/2007 19:07 
       If cpt =0 Then DateDebut=Left(Fic(i),16) : cpt=cpt+1

      'Utilisation de la fonction DateDiff pour comparer l'écart en minutes ("n")
      'entre la date de la variable dateDebut et la date (les 1- premiers
      'caractères de la ligne courante du tableau
      'Si l'écart (10') est atteint, on arrête de parcourir les lignes du tableau
      If DateDiff("n",Left(Fic(i),16), DateDebut) > 10 Then Exit For

      'Recherche sur la ligne courante du tableau si le mot "busy" existe
      'avec implémentation d'un compteur
      If InStr(1, Fic(i), strSearch) <> 0 Then cpt=cpt+1
    End if
Next
MsgBox "le mot " & strSearch & " a été trouvé " & cpt -1 & " fois"

jean-marc
3
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
21 oct. 2007 à 22:50
 Bonsoir,

L'exemple ci-dessous permet de vérifier l'existence d'une occurrence dans une chaine.
Il suffit donc de lire le fichier par la fin et de vérifier date/occurrence.
Mais pour celà, il faut voir la structure du .log

Option Explicit
Const Texte = "000:08:17 S: DS OUT busyOT *;"
Const sChaine = "busy"   ' chaine recherchée.

If RegExpTest(sChaine, Texte) = True Then msgbox "expression trouvée...true"
If RegExpTest(sChaine, Texte) = False Then msgbox "expression non trouvée...false"

Function RegExpTest(patrn, strng)
   Dim regEx, Match, Matches
   Set regEx = New RegExp                ' Crée une expression régulière.
   regEx.Pattern = patrn                 ' Définit les critères.
   regEx.IgnoreCase = True               ' True,False    Ignore la casse.
   regEx.Global = False                  ' True, False   rechercre récursive.
   Set Matches = regEx.Execute(strng)    ' Lance la recherche
   For Each Match in Matches             ' Itère la collection Matches.
       RegExpTest = True : Exit Function ' Retourne Vrai si expression trouvée + exit
   Next
   RegExpTest = False                    ' Retourne Faux si expression non trouvée
End Function

jean-marc
0
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008
22 oct. 2007 à 08:34
Merci JMO pour la rapidité de ta réponse
Voici un petit bout du fichier de log :

13/10/2007 19:07:57 serveur SERKernel[PteEventManager1] : svc-appcenter;INFO;PteEventManager1handleEvent;SERKernel;GWINFO; GWINFO : CR Technique OK renvoyé pour l'évènement : Forfait::SicSer::formuleSouscrite  [trackId=aw_share1.0;14;aw_dpf_proc_id136;dpfProcId={ForfaitAmsFormuleSouscrite;v3.0;1192295264276|178145|brk_100_UBXdpa021@bt1sssgt:22406/bkc_UBXSEQ01_D;

13/10/2007 19:07:57 serveur SERKernel[PteEventManager4] : svc-appcenter;INFO;PteEventManager4handleFiltrageException;SERKernel;GWINFO; GWINFO : Compte rendu Fonctionnel OK renvoyé pour l'évènement : Forfait::SicSer::formuleSouscrite  [trackId=aw_share1.0;14;aw_dpf_proc_id136;dpfProcId={ForfaitAmsFormuleSouscrite;v3.0;1192295264281|178146|brk_100_UBXdpa021@bt1sssgt:22406/bk;
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
22 oct. 2007 à 09:37
 Bonjour,

1) Lecture du fichier ligne par ligne et écriture dans un tableau;
2) Lecture du tableau par la fin avec test de la date + recherche de l'occurrence.

Option Explicit
Const ForReading = 1
Dim objFso, objTextStream, strFile, strSearch, i, DateDebut
Dim Fic()
ReDim Fic(0)

strFile = "D:\LOG.txt"
strSearch = "busy"

Set objFso = CreateObject("Scripting.FileSystemObject")
Set objTextStream = objFso.OpenTextFile(strFile, ForReading)

Do While Not objTextStream.AtEndOfStream
   ReDim Preserve Fic(UBound(Fic) + 1)
   Fic(UBound(Fic)) = objTextStream.ReadLine
Loop
objTextStream.Close
Set objTextStream = Nothing

For i=UBound(Fic) To 1 Step -1
    If i=UBound(Fic) Then DateDebut = Left(Fic(i),16)
    If DateDiff("n",Left(Fic(i),16), DateDebut) > 10 Then Exit For
    If InStr(1, Fic(i), strSearch) <> 0 Then MsgBox Fic(i)
Next
Set objFso  = Nothing

jean-marc
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008
22 oct. 2007 à 11:08
Bonjour,

Le script fonctionne très bien par contre j'ai un petit souci pour initialisé un compteur, au lieu d'afficher les lignes, il ne me remonte que le nombre de fois il a trouver le mot

Merci pour ton aide
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
22 oct. 2007 à 11:23
Re,

exemple:
Dim cpt, resultat
cpt = 1
For i=UBound(Fic) To 1 Step -1
    If i=UBound(Fic) Then DateDebut = Left(Fic(i),16)
    If DateDiff("n",Left(Fic(i),16), DateDebut) > 10 Then Exit For
    If InStr(1, Fic(i), strSearch) <> 0 Then
       resultat = "compteur:" & cpt &vbTab& Fic(i) &vbCrLf&vbCrLf& resultat
       cpt = cpt+1
    End if
Next
MsgBox resultat

jean-marc
0
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008
22 oct. 2007 à 11:57
En fait ce n'est pas ce qui je souhetais mais ça donne aussi le bon resultat. Je souhaitais ne pas afficher les messages mais seulement le nombre de lignes trouvées car celà risque d'être illisible s'il y a bcp d'occurences
Ex.
au lieu de :
13/10/2007 19:21:17 serveur SERKernel[busy] : svc-appcenter;INFO;PteEventManager2handle
Event;SERKernel;GWINFO; GWINFO : CR Technique OK renvoyé pour l'évènement : Forfait::SicSer::formule

13/10/2007 19:21:17 serveur SERKernel[busy] : svc-appcenter;INFO;PteEventManager2handle
Event;SERKernel;GWINFO; GWINFO : Transformation XML OK pour l'évènement : Forfait::SicSer::formuleSo

il t'affiche : 2 (le nombre de lignes trouvées)
0
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008
22 oct. 2007 à 12:01
Comme je suis un peu débutant dans VBS, il y a certaines lignes que je comprends pas bien.
Aurais-tu la gentillesse de commenter le script en vue d'une évolution future.
Merci
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
22 oct. 2007 à 13:19
Re,

Avec les commentaires !!!

'Quand vous utilisez l'instruction Option Explicit, vous devez
'déclarer explicitement toutes les variables en utilisant les
'instructions Dim, Private, Public ou ReDim.
'Si vous essayez d'utiliser le nom d'une variable non déclarée, une erreur se produit
Option Explicit
'Déclaration des constantesConst ForReading 1, ForWriting 2, ForAppending = 8
'Déclaration des objets et variables
Dim objFso, objTextStream, strFile, strSearch
Dim i, DateDebut, resultat, cpt
'Initialisation d'un tableau dynamique
Dim Fic()
ReDim Fic(0)

strFile = "D:\LOG.txt"
strSearch = "busy"
'Ouvre un fichier spécifié et renvoie un objet TextStream qui peut
'être utilisé pour lire, écrire et effectuer des ajouts au fichier
'ici ce sera en lecture
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objTextStream = objFso.OpenTextFile(strFile, ForReading)

'Lecture ligne à ligne du début jusqu'à la fin du fichier
Do While Not objTextStream.AtEndOfStream
'Implémentation du tableau
   ReDim Preserve Fic(UBound(Fic) + 1)
   Fic(UBound(Fic)) = objTextStream.ReadLine
Loop
'Fermeture du fichier
objTextStream.Close
'Suppression des objets
Set objTextStream = Nothing
Set objFso  = Nothing

'Lecture du tableau de la fin jusqu'au début
cpt = 1
For i=UBound(Fic) To 1 Step -1
    'au 1er passage dans la boucle For...Next, on initialise
    'la variable DateDebut dans laquelle on met les 16
    'premiers caractères de gauche de la dernière ligne
    'du tableau ex: 13/10/2007 19:07
    If i=UBound(Fic) Then DateDebut = Left(Fic(i),16)

    'Utilisation de la fonction DateDiff pour comparer l'écart en minutes ("n")
    'entre la date de la variable dateDebut et la date (les 1- premiers
    'caractères de la ligne courante du tableau
    'Si l'écart (10') est atteint, on arrête de parcourir les lignes du tableau
    If DateDiff("n",Left(Fic(i),16), DateDebut) > 10 Then Exit For

    'Recherche sur la ligne courant du tableau si le mot "busy" existe
    'avec implémentation d'un compteur
    If InStr(1, Fic(i), strSearch) <> 0 Then
       'la variable resultat n'est pas remplie car la ligne a été mise
       'en commentaire (le caractère ' correspond au REM du dos)
       'resultat = "compteur:" & cpt &vbTab& Fic(i) &vbCrLf&vbCrLf& resultat
      
       'Incrémentaion du compteur
       cpt = cpt+1
    End if
Next
MsgBox "le mot " & strSearch & " a été trouvé " & cpt & " fois"

jean-marc
0
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008
22 oct. 2007 à 15:10
Merci bcp
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
22 oct. 2007 à 17:07
Re,

Afin de clôturer ce topic, merci de valider le bouton vert (Réponse acceptée) du 22/10/2007 13:19:08.

jean-marc
0
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008
26 oct. 2007 à 09:25
Bonjour,
Une petite dernière pour la route.
J'ai découvert un nouveau pb, à savoir quand la ligne du fichier log ne commence pas par la date, le script remonte une erreur pour dire que le debut de ligne ne correspond pas type attendu :
P:\Document\Scripts\Script en test\read4.vbs(52, 5) Erreur d'exécution Microsoft VBScript: Type incompatible: '[string: " serveur SERKer"]'

Comment faire pour ne pas prendre en compte ces genres de lignes dans le tableau

merci d'avance
0
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008
26 oct. 2007 à 09:55
Bonjour,
Une petite dernière pour la route.
J'ai découvert un nouveau pb, à savoir quand la ligne du fichier log ne commence pas par la date, le script remonte une erreur pour dire que le debut de ligne ne correspond pas type attendu :
P:\Document\Scripts\Script en test\read4.vbs(52, 5) Erreur d'exécution Microsoft VBScript: Type incompatible: '[string: " serveur SERKer"]'

Comment faire pour ne pas prendre en compte ces genres de lignes dans le tableau

merci d'avance
0
sakalala Messages postés 19 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 25 janvier 2008
26 oct. 2007 à 15:50
merci ça marche,
je valide la réponse
0
Rejoignez-nous