Ecriture dans un fichier de log - Perl - Programmation
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+,
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.
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.
Marsh Posté le 05-08-2010 à 15:26:53
ReplyMarsh Posté le 05-08-2010 à 17:18:59
Ca te simplifie le code, mais ce ne change rien aux io je pense.
Marsh Posté le 06-08-2010 à 10:26:02
ccp6128 a écrit : Je suis passé à Tie::File |
Non, à chaque print, ça te sauve tout le fichier.
A+,
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+,
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.
Marsh Posté le 06-08-2010 à 16:08:11
C'est sous unix ou sous windows que ça doit tourner?
A+,
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 ?