我正在将一些 cgi 脚本转换为 mod_perl。在 cgi 下,每当有未捕获的异常时,我使用 sig DIE 来捕获堆栈跟踪,并记录它们。这很好用:每当脚本中出现问题时,我都会在我的应用程序日志中得到一个很好的堆栈跟踪。代码是:
BEGIN {
$SIG{__DIE__} = \&sigDie;
}
sub sigDie {
return 1 if $^S; # we are in an eval block
my ($error) = @_;
cluck("Caught fatal error: $error"); # put a stack trace in the logs via warn
local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
FATAL @_; # call log4perl's fatal
return 1;
}
然而,在 Apache2::Registry 下,我的代码不再被调用,它只是在它死时停止记录。我认为这是因为我的代码正在被 mod_perl 评估,但我在上面的例程中取消了评估检查,但我仍然没有被调用。
有什么办法可以在 mod_perl 下得到我想要的东西?我发现这些自动记录堆栈跟踪非常有用,如果我不得不放弃它们,我会错过它们。到目前为止,我对如何获得它一无所知。