作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 perl 脚本,它将消息写入 STDOUT 和 STDERR(通过 print/croak 语句),但我还将 STDOUT 和 STDERR 重定向到日志文件:
File::Tee::tee STDOUT, ">>", "$logFile" ;
File::Tee::tee STDERR, ">>", "$logFile" ;
select(STDERR) ;
$| = 1 ;
select(STDOUT) ;
$| = 1 ;
sub warning_handler {
my $msg = $_[0] ;
print STDERR $msg ;
print $log $msg if defined $log ;
}
$SIG{__WARN__} = \&warning_handler ;
use IO::Tee ;
use Capture::Tiny qw(capture);
...
...
select(STDERR) ;
$| = 1 ;
select(STDOUT) ;
$| = 1 ;
open (my $log, ">", $logfilename) ;
*REALSTDOUT = *STDOUT ;
*REALSTDERR = *STDERR ;
*STDOUT = IO::Tee->new(\*REALSTDOUT, $log);
*STDERR = IO::Tee->new(\*REALSTDERR, $log);
# Regular Perl code here which sends output to STDOUT/STDERR
...
...
# system calls / calls to .so needs to be catpured
&log_streams(sub { &some_func_which_calls_shared_object() ; }) ;
sub log_streams {
my ($cr, @args) = @_; # code reference, with its arguments
my ($out, $err, $exit) = capture { $cr->(@args) };
if ($out) {
print STDOUT $out;
}
if ($err) {
print STDERR $err;
}
}
最佳答案
使用两个单独的文件句柄,没有契约(Contract)或保证您会实时看到它们。各种设置和缓冲区会影响这一点,这就是为什么您会看到自动刷新的东西 ($|
)。文件或终端的想法相同。
意识到这是一个架构问题,而不是句法问题。你有两个东西在争夺同一个资源。这通常以泪水告终。当我不知道问题出在哪里时,我会犹豫提出解决方案,但请考虑尝试写入 STDOUT
的任何内容。或 STDERR
写入某种收集所有消息的消息代理,并且是唯一写入最终(共享)目的地的东西。例如,想要将条目添加到 syslog 的内容不会写入 syslog;他们将消息发送到写入系统日志的事物。
一个更 Perly 的示例:在 Log4perl 中,您不会写入最终目的地。您只需记录一条消息,记录器就是弄清楚如何处理它的唯一方法。当我想要模块的这种行为时,我不直接使用输出工具:
debug( "Some debug message" );
sub debug {
my $message = shift;
output( "DEBUG: $message" );
}
sub output { # single thing that can output message
...
}
output
中做任何你需要做的事情.
warn
来解决这个问题。和 friend 通过在
$SIG{__WARN__}
中添加一个 coderef 来做到这一点.您可以捕获警告消息并对它们做任何您喜欢的事情(例如将它们发送到标准输出)。除此之外是重新打开
STDERR
的黑魔法到你可以控制的东西上。没那么糟糕,它被隔离在一个地方。
关于perl - STDOUT 和 STDERR 乱序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60231691/
我是一名优秀的程序员,十分优秀!