Page 1 sur 1

[..] Script pour "nettoyer" des fichiers logs

Posté : mer. 15 juil. 2009 11:21
par seishiro
Bonjour,

Je travaille en tant que Technicien Systèmes et Réseaux pour une société et je suis totalement (ou quasi totalement) novice en scripting.

J'ai mis en place, récemment, un système de sauvegarde de tout notre Système d'Information.

Il y a un serveur, dans notre architecture, sur lequel, tous les jours, est créé un fichier de logs qui fait 500 Mo. Ce serveur ne nous appartient pas (je ne peux donc pas modifier les paramètres de rotation de logs de l'application sur ce serveur) mais nous avons à charge de la sauvegarder quand même (et ça prend trop de place sur ma sauvegarde).

Alors, au lieu de les supprimer à la main à chaque fois, je voulais créer un script (AutoIT) qui supprime (en fonction des dates) les fichiers qui datent de plus d'un mois mais je galère à le faire ce script.

Il y a un autre serveur sur lequel j'aimerais mettre en place cela mais je m'inspirerais du premier.

Pouvez-vous m'aider svp?

Merci d'avance.

Cordialement.

Re: [..] Script pour "nettoyer" des fichiers logs

Posté : sam. 18 juil. 2009 01:11
par Tlem
Si les fichiers sont dans un même dossier accessible depuis votre PC, la fonction _FileListToArray vous permettra de créer un tableau avec la liste des fichiers du dossier (sinon utilisez la fonction _FileListToArray3 de ce message : http://www.autoitscript.fr/forum/viewto ... f=21&t=479 qui permet une recherche récursive).

Ensuite, une boucle For/Next de lecture du tableau vous permettra de lister chaque élément du tableau.
Avec chacun de ces éléments, deux choix :
- Soit la date est dans le nom et dans ce cas il faut créer un traitement de contrôle.
- Soit vous testez les propriétés du fichier pour en retirer la date de création ou de dernière modification avec la fonction FileGetTime

Une fois le traitement effectué, vous savez si le fichier doit être gardé ou supprimé, donc toujours dans la boucle et à la suite du traitement vous contrôlé l'age du fichier et effectuez le traitement adéquate. ;)

Re: [..] Script pour "nettoyer" des fichiers logs

Posté : sam. 18 juil. 2009 14:16
par jl56
bonjour,


J'ai eu le même besoin pour effacer des fichiers catalogue de sauvegarde, je viens d'adapter la partie du code
au fichier log et j'ai commenté les lignes

Code : Tout sélectionner

#include <Date.au3>
$repertoire="c:\testlog\"  ; dossier ou se trouve les fichiers log

$datejour = _DateToDayValue (@YEAR, @MON, @MDAY)
$delai=15 ; variable définissant le délai en jour pour l'effacement des fichiers
$search = FileFindFirstFile ($repertoire&"*.log") ; recherche des fichiers log
        If $search = -1 Then 
        MsgBox(4096,"erreur de répertoire des fichiers log"," vérifier le dossier "&@CRLF&$repertoire,10) 
        Else
                While 1 ; boucle pour tester les fichiers l'un apres l'autre
                    $fichier_a_fac = FileFindNextFile($search) 
                    If @error Then ExitLoop
                        
                    $t=FileGetTime($repertoire&$fichier_a_fac,0)
                                        
                    $vrr=_DateToDayValue ($t[0]  , $t[1]  , $t[2]) ; calcul la date du fichier
                    
                    if $vrr<($datejour-$delai) Then         ; si la date du fichier est supérieur à (la date du jour - le délai) alors effacement du fichier
;~                          FileDelete ($repertoire&$fichier_a_fac) ; effacement du fichier
                            MsgBox(4096,"fac le fichier",$repertoire&$fichier_a_fac)  ; msgbox pour vérifier que les 
;~                                                                                                     fichiers effacés sont les bon 
;~                                                                                                     ensuite valider la ligne ci dessus
                    EndIf
                WEnd
        EndIf       
FileClose($search)
A+ JL56

Re: [..] Script pour "nettoyer" des fichiers logs

Posté : mar. 21 juil. 2009 11:24
par BaKeMoNo
Bonjour,

pour le traitement d'un fichier log de 500mo, il vaut mieux le faire en perl, bien plus performant qu'AutoIt pour le traitement des gros fichiers.

j'utilise beaucoup l'association AutoIt / Perl pour mes épluchages de logs, je peux éventuellement donner un coup de main pour la réalisation du script :)

Re: [..] Script pour "nettoyer" des fichiers logs

Posté : mar. 21 juil. 2009 13:01
par seishiro
Bonjour,

Je ne connais absolument pas le Perl. Mais je suis preneur tout est bon à prendre. Ça me sera toujours utile.

Merci.

Cordialement.

Re: [..] Script pour "nettoyer" des fichiers logs

Posté : mar. 21 juil. 2009 13:43
par BaKeMoNo
tout d'abord, il te faudra installer ActivePerl
ensuite construire un fichier fichier.pl qui contiendra ceci :

Code : Tout sélectionner

#!/usr/local/bin/perl
open(LIRE,"LOG_ORIGINE.txt") || die ("Erreur de lecture de LIRE") ;
open(ECRIRE,">>RESULTAT.txt") || die ("Erreur de creation de ECRIRE") ;
while (<LIRE>) { 
if ($_ =~ m/MA_RECHERCHE/) {
    print ECRIRE $_ ; 
    }
}
close(LIRE);
close(ECRIRE); 
ce code la va ouvrir en lecture le fichier LOG_ORIGINE.txt,
rechercher la reg exp MA_RECHERCHE sur chaque ligne ($_ = une ligne) de ce fichier, et copier la (ou les) ligne(s) contenant cette expression MA_RECHERCHE dans le fichier RESULTAT.txt

en sachant ça tu peux, dans le script auto-it, faire en sorte de rechercher plusieurs reg exp différentes, stockées par exemple dans un fichier recherche.txt, via une boucle en modifiant directement fichier.pl avant de l'exécuter :

Code : Tout sélectionner

#include <file.au3>

$file=fileopen("recherche.txt",0)

while 1
    $line = filereadline($file)
    if $line="" then exitloop
    _FileWriteToLine("fichier.pl", 5, "if ($_ =~ m/" & $line & "/) {",1)
    RunWait("perl fichier.pl",@WorkingDir)  
WEnd

fileclose($file)
par contre, le fichier recherche.txt ne doit contenir aucune ligne vide...
il est possible de convertir la liste en tableau, ce qui évite ce genre de contraintes :

Code : Tout sélectionner

#include <file.au3>
#include <array.au3>
global $myarray

_filereadtoarray("recherche.txt", $myarray)

for $i = 1 to ubound($myarray)-1
    if $myarray[$i]<>"" Then
    _FileWriteToLine("fichier.pl", 5, "if ($_ =~ m/" & $myarray[$i] & "/) {",1)
    RunWait("perl fichier.pl",@WorkingDir)  
    EndIf
Next
Ici, si le script trouve une ligne vide dans recherche.txt, il l'ignore et passe à la suite.

A la fin du traitement, uniquement les lignes contenant les expressions qui t'intéressent seront recopiées dans le nouveau fichier RESULTAT.txt. Attention, pour chaque nouvelle exécution, il faudra d'abord détruire le fichier RESULTAT.txt, sinon il sera automatiquement incrémenté.

Edit. après réflexion, je crois que l'épuration du fichier log lui même n'était pas le but recherché, uniquement le tri de tous les fichiers logs contenus dans le dossier.

SEISHIRO, pourrais tu confirmer que le but de la manœuvre est d'épurer 1 log, et non pas d'épurer un dossier contenant plusieurs logs ?
S'il s'agit d'épurer 1 seul log, pourrais tu en copier quelques lignes pour en voir la structure ?

Re: [..] Script pour "nettoyer" des fichiers logs

Posté : mer. 29 juil. 2009 12:52
par seishiro
Bonjour,

Désolé pour cette absence.

Effectivement il s'agit bien d'un répertoire dans lequel épurer plusieurs logs.

Merci.