Perl:Log4Perl在未处理错误的情况下调用log4perl

时间:2012-10-08 08:20:39

标签: perl fatal-error log4perl

在log4Perl中是否有一种方法可以强制我的程序甚至在eval子句之外记录致命错误?我想实现在任何未处理的程序终止时也调用log4perl。我希望在我的标准模块中添加相关的错误处理程序,该模块加载了我的所有Perl程序。
Perl版本目前是5.8,但我很快就会升级。
这是给定答案的测试代码。我在屏幕上看不到DIE,也没有看到die.txt被创建。

 use Log::Log4perl qw(get_logger);
$a->test();
$SIG{__DIE__} = sub {
 warn "DIE";
 open DIE,">die.txt";
 print DIE "died\n";
 close DIE;
};

1 个答案:

答案 0 :(得分:4)

看起来像常见问题How can I make sure my application logs a message when it dies unexpectedly?

use Log::Log4perl qw(get_logger);

$SIG{__DIE__} = sub {
    if($^S) {
        # We're in an eval {} and don't want log
        # this message but catch it later
        return;
    }
    local $Log::Log4perl::caller_depth =
          $Log::Log4perl::caller_depth + 1;
    my $logger = get_logger("");
    $logger->fatal(@_);
    die @_; # Now terminate really
};

有关详情,请参阅perlipc