Garder les dernieres lignes d'un fichier texte

Garder les dernieres lignes d'un fichier texte - C++ - Programmation

Marsh Posté le 25-09-2004 à 17:47:35    

Bonjour à tous,
 
Voila je réalise une application en C/C++ sous unix et j'ai une fonction de log qui se charge d'écrire dans un fichier tous les messages d'erreur qui surviennent...
 
Mais le probleme est que je ne veux pas que le fichier texte devienne enorme, seules les dernieres lignes (peut etre quelques centaines de lignes qd meme) sont importantes.
 
je voudrais que l'application face l'equivalent de la commande :
tail -1000f log.txt > log.txt
 
mais comment faire ca en C ou C++ ?
 
Merci d'avance

Reply

Marsh Posté le 25-09-2004 à 17:47:35   

Reply

Marsh Posté le 25-09-2004 à 18:11:54    

Tu lis les lignes que tu veux, tu écrases ton fichier en créant un nouveau dans lequel tu écris les lignes lues auparavant (=> ce que tu as écris)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-09-2004 à 18:17:32    

tu lirais tout en memoire et re-creerais le fichier... oui pkoi pas c'est une solution
 
Y a t-il des risque de surcharger la memeoire du serveur en faisant ca ? (mon appli est censée tourner 24/24 sur un serveur et il doit etre short au nivo de la ram), tu me diras ca depend du nombre de lignes mais si j'ai conserve entre 1000 et 2000 lignes ?

Reply

Marsh Posté le 25-09-2004 à 18:30:10    

Oui ca depend du nombre de lignes, sinon c'est fichier temporaire, ou alors du non portable : tu lis la fin du fichier, tu la recopie au début, et "racourci" la taille du fichier. C'est le "racourcissement" qui n'est pas portable (spécifier la nouvelle taille du fichier).
Mais bon, disons 10000 lignes de 100 caractères, ça fait 1Mo, en surévaluant large. Si ton server meurt pour 1Mo...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-09-2004 à 18:35:57    

j'espere qu'il ne va pas mourir mon serveur, j'y tiens ;)
qu'entends tu par du non portable ? il n'y a pas de fonction toute faite pour raccourcir le fichier c'est ca...
bin sinon ta solution de réécrire au debut du fichier peut surement etre envisageable... je vais reflechir a la question
merci

Reply

Marsh Posté le 25-09-2004 à 18:37:27    

Si y'a une fonction, mais c'est propre à ton OS, et c'est pas en standard C/C++. Donc ton prog risque de ne pas compiler sur d'autres OS...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-09-2004 à 18:51:30    

putain mais vous êtes tous des incapables !
 
c'est pas au soft lui même de gérer les logs !
 
fluminis > install logrotate sur ton serveur, configure le, et il va te faire tout seul comme un grand la rotation compactage des logs, de manière transparente (et oui, il se passe quoi avec vos bêtises s'il y a des messages lors de la rotation ?)

Reply

Marsh Posté le 25-09-2004 à 18:55:40    

ha ha ha ! tu m'en diras tant. c'est interessant tout ca.
mais alors comment qu'il fait ton soft, car lui aussi il peut etre entrain de faire ses manips, quand le prog ecrit dans le fichier ??
Bon je vais voir ce prog, il m'interesse.

Reply

Marsh Posté le 25-09-2004 à 19:03:34    

parce que logrotate manipule les fichiers de telle manière qu'il n'y a pas de problème

Reply

Marsh Posté le 25-09-2004 à 19:40:20    

bon j'opte pour ta solution Taz ! comme ca mon prog n'a plus besoin de gerer tout ca :)
merci

Reply

Marsh Posté le 25-09-2004 à 19:40:20   

Reply

Marsh Posté le 26-09-2004 à 17:41:39    

Pour ma part j'adopte la solution suivante pour les fichiers logs: avant chaque écriture, le prog controle la taille du fichier. S'il a atteint la taille limite fixée, le fichier est renommé. Cela suppose une ouverture/fermeture à chaque écriture : gourmant en ressource. Tout dépend de ton applicatif : multi utilisateur, fonction appelée par plusieurs progs ...
La prochaine écriture de log recreera le fichier log.
Pour ce qui est de la synchro, Unix possède un tas d'outils comme tous OS multi-tache et utilisateur, sémaphore par exemple.

Reply

Marsh Posté le 26-09-2004 à 18:10:12    

et t'as pas l'impression que si des softs de rotation de logs exisent, c'est justement pour pas réinventer la roue à chaque fois, laisser le système gérer ça et permettre à l'utilisateur un paramètrage fin ?

Reply

Marsh Posté le 26-09-2004 à 18:13:24    

je pense qu'il faut a la fois utiliser les semaphores puisque mon appli sera multithread pour etre sur que deux thread n'ecrire pas tous les deux en meme temps dans le fichier et utiliser l'outil systeme pour que l'admin du systeme puisse configurer ca comme il veut.

Reply

Sujets relatifs:

Leave a Replay

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