Ecriture de log et accès simultané au fichier

Ecriture de log et accès simultané au fichier - Perl - Programmation

Marsh Posté le 08-12-2008 à 13:52:03    

Bonjour,
 
Je réalise en ce moment une application en Perl qui est composé de plusieurs scripts ".pl".
 
Ces scripts peuvent être appelés via des évenements bien précis tel que l'ouverture d'un mail ou l'accès à une page web.
 
Ces scripts doivent insérer une ligne dans un fichier de log lorsque l'evenement qui les a lancé est arrivé.  
Le problème est que ces evenements peuvent arriver en masse et au même moment !
 
Comme pour l'instant je faisais un "open F '> monfichier.log' or die('oh non');", il y avais des insertions qui echouaient.
 
Est ce que le module IO::Event pourrait résoudre ce problème, j'ai cru comprendre que cela permettait d'attendre l'accessibilité d'un fichier en écriture, mais je n'arrive pas à m'en servir.
 
Avez vous des solutions sinon pour gérer ce genre de problématique ou un exemple d'utilisation de IO::Event ?
 
Merci d'avance.


Message édité par yellu le 08-12-2008 à 13:54:17
Reply

Marsh Posté le 08-12-2008 à 13:52:03   

Reply

Marsh Posté le 08-12-2008 à 18:25:56    

Pour cela (les logs), il y a un module approprié, et tres puissant, log4perl (inspiré par log4j en java).
http://log4perl.sourceforge.net/
A+,


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

Marsh Posté le 08-12-2008 à 21:16:42    

Effectivement ça devrait régler mon problème, reste à appréhender la bête ^^
 
Merci beaucoup!

Reply

Marsh Posté le 08-12-2008 à 22:26:14    

Dans ton cas, je structurerais ca ainsi:
un package  My::Log (ou ce qui te conviens) dans lequel est fait le code de l'initialisation du logger.
Le nom du fichier de log est filé au logger a ce moment la.
et chacun de tes scripts fait un  
use Log::Log4perl;
use My::Log;
un lancement de l'initialisation du logger si il ne l'est pas déja, par appel de ce qu'il faut dans My::Log, puis
my $log = Log::Log4perl->get_logger("My::Log" );
et des emplois avec
    $logger->trace("..." );  
    $logger->debug("..." );  
    $logger->info("..." );    
    $logger->warn("..." );    
    $logger->error("..." );  
    $logger->fatal("..." );  
selon tes besoins.
J'ai pas testé, mais a priori, je pense que ça devrait coller.
A+,


Message édité par gilou le 08-12-2008 à 22:26:26

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

Marsh Posté le 24-11-2009 à 04:55:19    

Personnellement, j'utiliserais plutot flock !

 

Tu fais un :
use Fcntl qw(:DEFAULT :flock);

 

Puis ensuite, juste après avoir ouvert le fichier (avec open ou meme sysopen),
si tu ne comptes que le lire : flock(FILEHANDLE, LOCK_SH);
si tu risques de le modifier: flock(FILEHANDLE, LOCK_EX);

 

SH = shared : verrou partagé
EX = exclusive : verrou exclusif

 

En fait, le concept est que le LOCK_SH ne sert strictement à rien s'il n'y a pas de LOCK_EX.
Car il peut y avoir plusieurs fichiers verrouillés en meme temps en SH, mais en revanche, s'il doit y avoir un verrou EX, la il sera seul (lui attendra que tous les autres aient fait close, et tous les autres (EX ou SH) attendront ensuite que lui seul ait fait close pour continuer)
flock fait en fait une sorte de sleep en attendant que la voie soit libre.


Message édité par MisterBark le 24-11-2009 à 04:59:02

---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Sujets relatifs:

Leave a Replay

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