Compteur log [Résolu]

Signaler
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008
-
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008
-
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.
A voir également:

14 réponses

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
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
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 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
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008

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;
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 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
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008

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
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
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
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008

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)
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008

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
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
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
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008

Merci bcp
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
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
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008

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
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008

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
Messages postés
19
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2008

merci ça marche,
je valide la réponse