Stdou redirigé vers un fichier mais quand meme affiché sur la console?

Stdou redirigé vers un fichier mais quand meme affiché sur la console? - Perl - Programmation

Marsh Posté le 22-10-2007 à 21:26:21    

Bonjour,
 
J'ai un script perl qui cree des fichiers de log en redirigant le Stdout vers un fichier. L'ennui, c'est que quand la fonction logguer est activee, je ne vois plus les commandes sur la console. Y-aurait-il un moyen pour faire les 2 en meme temps ?
 
Merci :jap:


Message édité par ParadoX le 22-10-2007 à 21:29:34

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 22-10-2007 à 21:26:21   

Reply

Marsh Posté le 22-10-2007 à 21:30:26    

Euh, pourquoi ne pas changer le code pour assigner les sorties logs à un flux de données spécifiques, sans toucher à stdout ? :??:

Reply

Marsh Posté le 22-10-2007 à 21:35:57    

Elmoricq a écrit :

Euh, pourquoi ne pas changer le code pour assigner les sorties logs à un flux de données spécifiques, sans toucher à stdout ? :??:


 
Hmm genre comment ? ^^
Pour le moment, stdout et stderr sont redirigés, je ne connaissais pas d'autres moyens pour rediriger des flux vers un fichier


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 22-10-2007 à 21:44:20    

La redirection se fait à l'intérieur du script, ou bien à l'appel avec un bête "blabla.pl > fichier_de_logs" ?

Reply

Marsh Posté le 22-10-2007 à 21:54:30    

Reply

Marsh Posté le 22-10-2007 à 21:59:29    

Ben annule la redirection, et assigne un nom de flux différent de STDOUT à la place à l'ouverture du fichier de logs.
Par contre il te faut ensuite rechercher toutes les sorties du programme pour les forcer à se produire sur le flux. Comme ça au final tu obtiendras le même comportement qu'au départ, sauf que la sortie standard restera intacte.

Reply

Marsh Posté le 22-10-2007 à 22:08:55    

Je ne comprends pas ton "assigne un nom de flux différent de STDOUT " [:transparency]


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 22-10-2007 à 22:11:32    

Tu dois avoir un truc du genre "open BLABLA, ">fichier de logs", suivi de "STDOUT->fdopen(\*BLABLA, "w" )".
 
Désactive le "STDOUT->...", puis modifie tous les "print ..." pour "print BLABLA ...".
 
That should do it. [:dawa]

Reply

Marsh Posté le 22-10-2007 à 22:15:14    

Ok jessaye merci [:god]  :hello:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 21-11-2007 à 21:33:10    

ou tu crée un tuyau supplémentaire via tee
 

Code :
  1. ./script.pl | tee -a fichier.log


Message édité par couak le 21-11-2007 à 21:33:21
Reply

Marsh Posté le 21-11-2007 à 21:33:10   

Reply

Marsh Posté le 21-11-2007 à 21:37:27    

Son problème était inverse : le script redirigeait stdout et donc... il n'avait plus du tout de stdout.
 
tee permet de rediriger stdout tout en conservant le flux.

Reply

Marsh Posté le 22-11-2007 à 13:17:55    

Ben moi je comprend le problème comme couak. Il me semble que ce que ParadoX veut c'est un équivalent de tee.

Reply

Marsh Posté le 22-11-2007 à 13:44:55    

Je peux effectivement me tromper, mais je campe sur mes positions. [:dawao]
 
Parce que c'est le sujet de ma seconde réponse, et que ParadoX indique que la redirection se fait à l'intérieur du script. [:dawa]

Reply

Marsh Posté le 22-11-2007 à 17:18:34    

Oui, je pense qu'à l'intérieur du script il fait un truc du genre :

close STDOUT;
open STDOUT, ">outfile";


ce qui a pour effet d'envoyer dans un fichier tout ce qui devait s'afficher sur stdout. Et lui il voudrait que tout ce qui devrait s'afficher sur stdout s'affiche à la fois sur stdout et dans le fichier (ce qui est impossible sans faire deux sorties).

Reply

Marsh Posté le 22-11-2007 à 20:36:33    

Sinon, pour afficher dans les deux sorties (écran et fichier) sans réécrire tous les prints,  en mode unix, il est possible de rediriger le stdout vers tee
 

Code :
  1. open(STDOUT,"| tee $stdout_log_filename" ) or return(ERR_CODE_FATAL,"Error while teeing STDOUT to $stdout_log_filename" );


 
Il n'y a pas pour moi de besoin de clore le STDOUT avant...
 
Bon courage...

Reply

Marsh Posté le 22-11-2007 à 20:54:00    

Je ne connaissais pas cette solution, ça a l'air chouette ça. [:chapi-chapo]

Reply

Marsh Posté le 22-11-2007 à 21:14:07    

Perso je ne l'ai pas essayé pour STDOUT mais pour STDERR car j'utilise des modules pour lesquels je voulais garder une trace écrite des messages envoyés sur STDERR pour pouvoir faire des analyses à posteriori en cas de pb...
 
Et ne pas faire attention or return(ERR_CODE_FATAL, "..." ) c'est ma gestion perso des codes retours ... faire un die à la place


Message édité par dreameddeath le 22-11-2007 à 21:15:33
Reply

Marsh Posté le 23-11-2007 à 00:01:22    

Ouais joli ! En fait j'avais essayé le coup du open avec un pipe vers tie mais avec le close avant ça marchait pas (tee: write error: Bad file descriptor). Sans fermer STDOUT ça marche bien.

Reply

Sujets relatifs:

Leave a Replay

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