Ecriture dans un fichier de log

Ecriture dans un fichier de log - Perl - Programmation

Marsh Posté le 03-08-2010 à 12:30:15    

Je consacre un peu de temps a reprendre des scripts de monitoring en Perl, et je me pose une question concernant la meilleure façon de mettre a jour des fichiers de log.
 
Structure du fichier:
Des balises fixes en début et en fin de fichier (non négociables, ces logs sont feedés ensuite a une appli qui en a besoin pour fonctionner, ce qui est mon principal souci), genre <html> et </html>
 
En deuxième ligne, une ligne de taille fixe contenant la date et l'heure de dernière mise à jour du fichier
 
Puis, le contenu de mon fichier. En pratique ca donne :
 
<html>
LastUpdate : 2010:07:27:04:58:27:369760<br>
Lignes de log horodatées
</html>
 
Un fichier est généré par heure.
 
Ce log est construit par quelques scripts distincts lancés séquentiellement par un mini ordonnanceur, a intervalles réguliers.
 
J'effectue la mise à jour de la façon suivante :
- Ouverture du fichier en lecture et copie directe dans un tableau, puis fermeture
- Réouverture du fichier en écriture, réécriture des premières lignes a partir du tableau en mettant a jour l'heure, ajout des lignes générées par le script, remise en place de la balise de fin.
 
 
Ca fonctionne, mais sur le principe ca me parait lourd en I/O. Si je lance 20 fois mon script dans la minute, mon fichier sera intégralement lu et réécrit 20 fois ...
 
Y'aurait moyen d'optimiser ca ?

Reply

Marsh Posté le 03-08-2010 à 12:30:15   

Reply

Marsh Posté le 03-08-2010 à 15:25:34    

La je repeins la cuisine de ma mère, donc j'ai pas trop le temps de réfléchir à ça, mais jettes un œil à Log::Log4perl, le standard du log sous perl (et java)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-08-2010 à 23:31:23    

Tu commence mal car tes spécifications ne correspondent pas à un fichier de log. Un vrai fichier de log ne doit jamais être modifié, on ne peut que lui ajouter des données à la fin (chattr +a si besoin).
 
Sinon pour répondre à la question oui c'est légèrement lourd en io, mais ca dépend de la taille de ton fichier. La meilleure méthode pour ca c'est de stocker dans un autre fichier la position du dernier élément écrit. Ensuite pour écrire un nouvel élément tu fait un open, puis un seek vers cette position  et voila tu n'a plus qu'a ajouter ce qu'il manque au fichier.


---------------
Vous admin ? http://linux-attitude.fr
Reply

Marsh Posté le 04-08-2010 à 00:00:19    

Merci a vous 2 je regarde ca demain.
 
Peck : t'as tout a fait raison, je me demande encore pourquoi l'appli derrière a besoin d'un truc aussi alambiqué :/
 
Je regarderai ca pour l'histoire du seek, a priori je pourrais me débrouiller vu que les déplacements sont fixes.

Reply

Marsh Posté le 05-08-2010 à 15:26:53    

Je suis passé à Tie::File
 
Je vais voir si ca me permet de réduire les I/O.

Reply

Marsh Posté le 05-08-2010 à 17:18:59    

Ca te simplifie le code, mais ce ne change rien aux io je pense.


---------------
Vous admin ? http://linux-attitude.fr
Reply

Marsh Posté le 06-08-2010 à 10:26:02    

ccp6128 a écrit :

Je suis passé à Tie::File
 
Je vais voir si ca me permet de réduire les I/O.

Non, à chaque print, ça te sauve tout le fichier.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-08-2010 à 10:33:27    

Citation :

Ce log est construit par quelques scripts distincts lancés séquentiellement par un mini ordonnanceur, a intervalles réguliers.

Quand je lis ça, je pense plutôt script de log unique tournant comme un service et appelé par les autres scripts.  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-08-2010 à 11:59:23    

Retour sur mon test, effectivement Tie::File m'a pas spécialement avancé (autant d'I/O et occupation CPU en hausse).
 
Je pense qu'il va falloir que je refactorise une grosse partie du code (actuellement les scripts génèrent les logs ligne par ligne, il faudrait que je bufferise l'ensemble des lignes avant d'écrire par blocs le fichier).
 
Je regarderai au passage comment implémenter ta solution Gilou.

Reply

Marsh Posté le 06-08-2010 à 16:08:11    

C'est sous unix ou sous windows que ça doit tourner?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-08-2010 à 16:08:11   

Reply

Marsh Posté le 06-08-2010 à 17:04:50    

du Linux (RedHat 4 / Redhat 5 pour être précis).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed