Ecriture de log et accès simultané au fichier - Perl - Programmation
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+,
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!
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+,
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.
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