Puis-je envoyer STDOUT et STDERR à un fichier journal et également à l'écran dans Win32 Perl?
J'ai cherché sur Internet et trouvé quelques bonnes solutions pour le coup STDOUT à 2 endroits différents. Comme pour un fichier de log et aussi à l'écran en même temps. Voici un exemple:
use IO::Tee;
my $log_filename = "log.txt";
my $log_filehandle;
open( $log_filehandle, '>>', $log_filename )
or die("Can't open $log_filename for append: $!");
my $tee = IO::Tee->new( $log_filehandle, \*STDOUT );
select $tee;
Mais cette solution laisse STDERR aller seul à l'écran et je veux STDERR aller à la fois l'écran et également sur le même fichier journal que STDOUT est connecté à. Est-il même possible?
Ma tâche est d'obtenir mon processus de construction connecté, mais je veux aussi voir sur mon IDE de l'écran comme d'habitude. Et la journalisation des messages d'erreur est tout aussi important que l'enregistrement de l'heureux messages. Et d'obtenir les erreurs enregistrées dans un fichier journal distinct n'est pas une bonne solution.
source d'informationauteur Kurt W. Leucht
Vous devez vous connecter pour publier un commentaire.
Vous pouvez rediriger
stderr
àstdout
au shell de windows niveau en faisant quelque chose comme:Voir l'appui de l'article ici pour le mot officiel.
Alors vous pouvez utiliser cette stackoverflow répondre faire un
tee
de la coquille.- Je utiliser Log::Log4perl pour ce genre de choses. Il gère l'envoi de la sortie à plusieurs endroits pour vous, y compris l'écran, fichiers, bases de données, ou tout autre chose que vous aimez. Une fois que vous obtenez même un peu complexe, vous ne devriez pas faire ce genre de choses sur votre propre.
Au lieu de l'impression de descripteurs, vous venez de donner Log4perl un message et il calcule le reste. J'ai une courte introduction dans Mastering Perl. Il est basé sur Log4j, et la plupart des choses que vous pouvez faire dans Log4j que vous pouvez faire dans Log4perl, ce qui signifie également qu'une fois que vous savez cela, il devient transférable des compétences.
Bien que j'utilise le Log::Dispatch largement, j'ai utilisé ci-dessus pour journal de ce qui s'est réellement obtenu affiché à l'écran dans un fichier.
Assignez simplement le
STDERR
descripteur de fichier ...Dois mentionner que j'ai testé sur Windows, il fonctionne, cependant je utiliser StrawberryPerl.
Je n'ai pas de boîte de windows pour tester cela, mais peut-être que vous pourriez faire quelque chose comme faire un attaché de la poignée qui permet d'imprimer à la fois la sortie standard et d'un journal, puis de rediriger STDOUT et STDERR?
EDIT: La seule crainte que j'ai est la méthode de stockage des STDOUT pour les utiliser plus tard, j'ai ajouté une deuxième possibilité pour le stockage de la sortie standard pour les utiliser plus tard si le premier fonctionne pas sur Windows. Ils travaillent tous les deux pour moi sur Linux.
essayer :
Toutes les instructions d'impression, qui ne spécifient pas un descripteur de fichier (c'est à dire tout les messages réguliers) va envoyer la sortie vers le fichier journal. Toutes les instructions d'impression qui utilisent le STDERR descripteur de fichier (qui est, de toutes les erreurs) va envoyer la sortie à la fois sur la console et le fichier journal.
Donc, vous voulez
STDERR
à se comporter commeSTDOUT
va à la fois l'écran et le même fichier journal? Pouvez-vous juste dupSTDERR
avec(Je ne sais pas désinvolte, si vous souhaitez le faire avant ou après l'appel à
IO::tee->new
).J'ai écrit un minimaliste perl enregistreur avec réglage dynamique de la journalisation de vous donner les API suivantes: