Могу ли я отправить STDOUT и STDERR в файл журнала, а также на экран в Win32 Perl?

Для Eclipse работало следующее выражение:

Foo

jadajada Bar "

Регулярное выражение:

Foo[\S\s]{1,10}.*Bar*
13
задан brian d foy 26 March 2010 в 03:06
поделиться

5 ответов

Вы можете перенаправить stderr на stdout на уровне оболочки Windows, выполнив что-то вроде:

perl stuff.pl 2>&1

См. Поддержите статью здесь за официальное слово.

Затем вы можете использовать этот ответ о переполнении стека , чтобы выполнить тройник из оболочки.

perl stuff.pl 2>&1 | tee stuff.txt
5
ответ дан 1 December 2019 в 20:00
поделиться

Я использую Log :: Log4perl для подобных вещей. Он обрабатывает отправку вывода в несколько мест для вас, включая экран, файлы, базы данных или что-то еще, что вам нравится. Если вы хоть немного усложнились, вы не должны делать это самостоятельно.

Вместо того, чтобы печатать дескрипторы файлов, вы просто даете Log4perl сообщение, а он сам разберется. У меня есть краткое введение в него в Освоение Perl . Он основан на Log4j, и большую часть того, что вы можете делать в Log4j, вы можете делать в Log4perl, что также означает, что, как только вы его узнаете, он становится передаваемым навыком.

13
ответ дан 1 December 2019 в 20:00
поделиться
use PerlIO::Util;
*STDOUT->push_layer(tee => ">>/dir/dir/file");
*STDERR->push_layer(tee => ">>/dir/dir/file");

Хотя я широко использую Log :: Dispatch , я использовал приведенное выше, чтобы записать то, что фактически отображалось на экране, в файл.

8
ответ дан 1 December 2019 в 20:00
поделиться

Итак, вы хотите, чтобы STDERR вел себя как STDOUT , обращаясь одновременно к экрану и одному и тому же файлу журнала? Можете ли вы просто дублировать STDERR на

open(STDERR, ">&STDOUT") or warn "failed to dup STDOUT:$!";

(я не

0
ответ дан 1 December 2019 в 20:00
поделиться

Просто переназначьте дескриптор файла STDERR ...

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 );
*STDERR = *$tee{IO};
select $tee;

Следует упомянуть, что я тестировал это в Windows, он работает, но я использую StrawberryPerl.

3
ответ дан 1 December 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: