IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

problème avec File::Tee


Sujet :

Modules Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Points : 39
    Points
    39
    Par défaut problème avec File::Tee
    Bonsoir à tous,

    Pour un de mes projets ,j' essaye de réaliser les actions suivantes :

    - si un script est lancé via une console, alors les sorties d'erreur et standard sont redirigées à la fois à l'écran et dans un fichier de log

    - si le script est lancé via la crontab ou un autre ordonnanceur, les sorties sont uniquement redigirées dans une log

    Pour cela j'utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    use File::Tee qw(tee);
    use IO::Interactive qw(is_interactive);
     
    my $FILE="/home/olwin/Desktop/test";
     
     if ( is_interactive() ) {
    	##    ici le but est d'avoir les info a l'écran + ds un fichier de log    
    	tee STDOUT, { lock => 1, mode => '>>', open => "$FILE" };
      	tee STDERR, { lock => 1, mode => '>>', open => "$FILE" };
     
     }else{
     
      ## traitement lancé en crontab ou via un ordonnanceur quelconque
      open(STDOUT, ">$FILE") or die "erreur lors de l'ouverture de la sortie standard";
      open(STDERR, ">&STDOUT") or die "erreur lors de l'ouverture de la sortie d'erreur ";
      select (STDERR);
      # Suppression de la bufferisation de STDERR.
      $| = 1;
     select (STDOUT);
     # Suppression de la bufferisation de STDOUT.
     $| = 1;
    }
    Le soucis , en faisant un test en affichant les messages suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    print STDOUT " OUT 1";
    print STDERR " ERR 1";
    print STDOUT " OUT 2";
    print STDERR " ERR 2";
    via crontab : j'obtient bien la bonne séquence soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OUT 1 ERR 1 OUT 2 ERR 2
    mais lorsque je le lance via un terminal , la séquence est incorrect , j'obtient ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ERR 1 ERR 2 OUT 1 OUT 2
    Auriez vous une idée du pourquoi ?

    J'ai essayé de supprimer la bufferisation sur les 2 sorties avant d'utiliser le module File::Tee, mais cela ne fonctionne pas.
    (bizarrement si je rajoute des \n dans chaque print, cela a l'air de fonctionner)

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par olwin Voir le message
    Auriez vous une idée du pourquoi ?
    STDOUT est mis en tampon alors que STDERR n'a pas de tampon.

    Citation Envoyé par olwin Voir le message
    J'ai essayé de supprimer la bufferisation sur les 2 sorties avant d'utiliser le module File::Tee, mais cela ne fonctionne pas.
    (bizarrement si je rajoute des \n dans chaque print, cela a l'air de fonctionner)
    Normalement si tu as bien mis l'autoflush sur les deux sorties ça devrait marcher, comment as-tu essayé de le faire ?

    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Normalement si tu as bien mis l'autoflush sur les deux sorties ça devrait marcher, comment as-tu essayé de le faire ?

    --
    Jedaï

    Apparemment le module File::Tee gère l'autoflush par défaut, j'ai essayé les deux méthodes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     if ( is_interactive() ) {
     
    tee STDOUT, { lock => 1, mode => '>>', open => "$FILE", autoflush => 1 };
    tee STDERR, { lock => 1, mode => '>>', open => "$FILE", autoflush => 1 };
     
    }
    et celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     if ( is_interactive() ) {
     
    select (STDERR);
    $| = 1;
    select (STDOUT);
    $| = 1;
     
    ##    ici le but est d'avoir les info a l'écran + ds un fichier de log    
    tee STDOUT, { lock => 1, mode => '>>', open => "$FILE" };
    tee STDERR, { lock => 1, mode => '>>', open => "$FILE" };
     
    }
    Malheureusement aucune des deux n'a fonctionné

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par olwin Voir le message
    Malheureusement aucune des deux n'a fonctionné
    Tu as essayé de combiner les deux ? La deuxième marche chez moi sans File::Tee (marche pas sous Windows et tout de suite je suis sous Windows, je testerais sous Linux quand j'y retournerai si tu n'as pas réglé ton problème entre-temps).

    --
    Jedaï

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Tu as essayé de combiner les deux ? La deuxième marche chez moi sans File::Tee (marche pas sous Windows et tout de suite je suis sous Windows, je testerais sous Linux quand j'y retournerai si tu n'as pas réglé ton problème entre-temps).

    Jedaï
    Oui, cela ne fonctionne pas. (apparemment si le paramètre autoflush n'est pas renseigné, par défaut il est activé)

    J'ai regardé un peu le code du module, mais j'avoue que c'est bien au dessus de mes connaissances perl actuel

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    après plusieurs échec en voulant utiliser File::Tee, j'ai trouvé un module qui fonctionne partiellement :

    Le module est le suivant : Local::TeeOutput
    http://jenda.krynicky.cz/#Local::TeeOutput

    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        my $FILE="/tmp/test.txt";
        open (LOG, ">>$FILE");
        openTee (*STDOUT, *STDOUT, *LOG);
        openTee (*STDERR, *STDERR, *LOG);
    Le seul gros soucis pour le moment,c'est que celui ci :
    redirige bien les erreurs crée dans le script (via la commande print qu'il "surcharge")

    Mais du coup :
    - les erreurs ou les messages affichés sur SDTOUT des commandes système ne sont affichées que sur l'écran et ne sont pas écrites dans la log

    Mais au moins je n'ai plus de problème de bufferisation , qui rendait les logs vraiment ilisible
    Je me rapproche d'une solution viable

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    et bien j'ai enfin trouvé une solution !

    Parfois la meilleure solution est la plus simple --> passé par une commande système

    pour rediriger à la fois dans un fichier de log et sur l'écran, il suffit d'écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
           my $FILE="/tmp/test";
             select (STDERR);
    	# Suppression de la bufferisation de STDERR.
    	$| = 1;
    	select (STDOUT);
    	# Suppression de la bufferisation de STDOUT.
    	$| = 1;
     
    	open TEE, "| tee ${FILE}";
    	open STDOUT, ">&TEE";
    	open STDERR, ">&TEE";
    et bien sur ne pas oublier à la fin du programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    close (STDERR);
    close (STDOUT);
    close (TEE);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probléme avec FILE
    Par lisco dans le forum C++
    Réponses: 1
    Dernier message: 23/12/2009, 17h11
  2. problème avec files dans assembly
    Par felix79 dans le forum Maven
    Réponses: 4
    Dernier message: 15/09/2009, 11h39
  3. Problème avec File.Exists
    Par kazylax dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/06/2009, 15h40
  4. Bitmap et problème avec file move
    Par PatStan17 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 02/06/2009, 08h20
  5. [VS2008 Express] Problème avec File.SetLastWriteTime
    Par bubulemaster dans le forum Débuter
    Réponses: 3
    Dernier message: 06/07/2008, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo