我可以将STDOUT和STDERR发送到日志文件,也可以发送到Win32 Perl中的屏幕吗?

Kur*_*cht 13 perl logging redirect stdout stderr

我搜索过互联网并找到了一些很好的解决方案,可以将STDOUT发送到2个不同的地方.喜欢日志文件,同时也喜欢屏幕.这是一个例子:

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;
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案让STDERR只进入屏幕,我希望STDERR既可以进入屏幕,也可以进入STDOUT记录到的同一个日志文件.这甚至可能吗?

我的任务是记录我的构建过程,但我也想像往常一样在IDE的屏幕上看到它.记录错误消息与记录快乐消息一样重要.将错误记录到单独的日志文件中并不是一个好的解决方案.

bri*_*foy 13

我使用Log :: Log4perl来做这样的事情.它可以为您处理向多个位置发送输出,包括屏幕,文件,数据库或您喜欢的任何其他内容.一旦你变得有点复杂,你就不应该自己做这些事情.

您只需向Log4perl发送一条消息,而不是打印到文件句柄,它会计算出其余部分.我在Mastering Perl中有一个简短的介绍.它基于Log4j,你可以在Log4j中做的大部分工作都可以在Log4perl中完成,这也意味着一旦你知道它,它就变成了一种可转移的技能.

  • 我不认为它比"某些模块将消息打印到STDERR"的答案更清楚.我怎样才能将它们汇集到Log :: Log4perl?在Log4perl常见问题解答中.在Log4perl发行版中阅读它. (3认同)

Oes*_*sor 8

use PerlIO::Util;
*STDOUT->push_layer(tee => ">>/dir/dir/file");
*STDERR->push_layer(tee => ">>/dir/dir/file");
Run Code Online (Sandbox Code Playgroud)

虽然我广泛使用Log :: Dispatch,但我已经使用上面的内容将实际显示在屏幕上的内容记录到文件中.


msa*_*ord 5

您可以通过执行以下操作重定向stderrstdoutWindows shell级别:

perl stuff.pl 2>&1
Run Code Online (Sandbox Code Playgroud)

有关官方消息,请参阅此处的支持文章.

然后你可以使用这个stackoverflow的答案tee从shell 做一个.

perl stuff.pl 2>&1 | tee stuff.txt
Run Code Online (Sandbox Code Playgroud)