【问题标题】:How can I redirect output of die function to a file in Perl?如何将 die 函数的输出重定向到 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>。有没有办法从脚本中重定向它们?

【问题讨论】:

    标签: perl die perl-io


    【解决方案1】:

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

    local $SIG{__DIE__} = sub {
        my ($message) = @_;
        # log the message        
    };
    

    有关详细信息,请参阅 perlvar 中的 $SIG{expr}

    【讨论】:

      【解决方案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;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        • 2020-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多