如何将 die 函数的输出重定向到 Perl 中的文件?

Posted

技术标签:

【中文标题】如何将 die 函数的输出重定向到 Perl 中的文件?【英文标题】:How can I redirect output of die function to a file in Perl? 【发布时间】:2011-04-25 19:15:48 【问题描述】:

我想将die 消息重定向到一个单独的文件,以便我稍后可以比较该文件以确定哪里出了问题。

但是这段代码给了我错误:

$ cat test.pl
use strict;
use warnings;

my $log = "msglog.log";
die $log "DEAD$!";

$ perl test.pl
Missing comma after first argument to die function at test.pl line 5, near ""DEAD$!";"
Execution of test.pl aborted due to compilation errors.
$ 

我不想从调用者那里做一个2>。有没有办法从脚本中重定向它们?

【问题讨论】:

【参考方案1】:

您可以安装一个$SIG__DIE__ 处理程序以在“die”运行之前运行。将使用您可以记录的错误消息调用处理程序:

local $SIG__DIE__ = sub 
    my ($message) = @_;
    # log the message        
;

有关详细信息,请参阅 perlvar 中的 $SIGexpr。

【讨论】:

【参考方案2】:

Perl 的 die 打印到 STDERR,因此您可以将 STDERR 重定向到文件。

#!/usr/bin/env perl
# the path above depends on your system

open(STDERR, ">>", "errlog.log");
die "Hello";

【讨论】:

这也会重定向 warn() 消息、警告和其他任何打印到 STDERR 的内容。不仅如此,如果有人通过重新定义 DIE 处理程序正确地做到了这一点,它甚至可能不会重定向 die() 消息。【参考方案3】:

Log::Log4perl 模块提供了多个选项。

可以选择将错误消息同时输出到 STDERR 和日志文件。

my $logger = Log::Log4perl->init ( 'log.conf' );
# Configuration file controls what to output, like time, line number, class...

$logger->get_logger ( 'Hello::World' );  # Define which class logger to use

.
.
.

open my $fh, '<', $file
  or $logger->logdie ( "Log the demise: $!" );  # ... and die;

虽然在设置方面需要更多的努力,但它的灵活性释放了巨大的潜力。

【讨论】:

以上是关于如何将 die 函数的输出重定向到 Perl 中的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将控制台输出重定向到文本文件

Perl 将 '<' 视为常规字符,而不是输出重定向

使用系统命令将stdout和stderr输出重定向到文件在perl中不起作用[重复]

如何使用 c && 调用 c++ 函数将应用程序输出重定向到 Qt 中的 textEdit

perl输出重定向

Perl的die和warn函数