Parseur de logs

Petit nouveau ! | 1 Messages

23 mars 2009, 17:06

Bonjour à tous,

Je travail actuellement sur un parseur de log en PHP.
Je prends un fichier de log, je l'ouvre, je lis ligne par ligne, je modifie les données et j'insère ce qui m'intéresse dans une base de données. Tout va bien.

Maintenant, j'aimerai pouvoir interrompre ce processus de parse et le relancer ensuite à l'endroit où il s'est arrêté dans le fichier de log.
J'ai donc pensé à taguer les lignes de logs traitées au fur et à mesure du parse.

Voilà mon code :

Code : Tout sélectionner

$file='mon_fichier.log'; $content = fopen($file, 'r+'); while($content && !feof($content)){ $line=fgets($content); ma_fonction_de_traitement($line); // insertion du tag <FAIT> fputs($content, '<FAIT>'); } fclose($content);
Or, ce morceau de code remplace les 6 premiers caractères de chaque ligne suivante par le tag <FAIT>, au lieu d'ajouter le tag en début de la ligne courante.

Pensez vous que ma méthode qui consiste à taguer les lignes traitées est une bonne pratique pour éviter de parser deux fois les mêmes lignes ? Et si oui, comment faire pour taguer ces lignes correctement ?

Enfin, ce serait royal si, en plus, on pouvait me donner l'équivalent de ce code en PERL :D

Merci par avance pour votre aide,

ViPHP
ViPHP | 1136 Messages

23 mars 2009, 19:28

Slt ,

Personnellement , j'ai aussi due parsser des logs pour surveiller l'arrivée de fichier sur les comptes FTP.

J'ai donc simplement modifier les logs générés par mon service FTP , pour y insérer un timestamp

Ainsi PHP récupère via un appel système , les dernières lignes du fichier de log , à partir du dernier timestamp .

Ensuite , il met à jour le timestamp auquel le script s'est arrêté .

Et ainsi de suite , via une tache cron ..

Ce n'est pas forcement la meilleurs méthode , mais j'avoue être bien content du résultat .. :-)

Maintenant , pour ton cas , peux tu changer le format de tes logs ?

Eléphant du PHP | 141 Messages

23 mars 2009, 21:24

A ta place, j'écraserais toute la ligne
fputs($content, "<fait>".$line);
Comme ça toutes la ligne sera réécrite.

L'idée de tagguer les lignes reste le plus simple, mais pourquoi ne pas mettre simplement un # devant les lignes à ignorer ?

ViPHP
ViPHP | 5924 Messages

24 mars 2009, 00:43

Alors, personnellement je donnerais une nouvelle idée. Si les logs que tu traites sont des logs apache, tu peux directement rediriger le log d'apache directement vers ton script…