您可以使用Carp 的 longmess 函数来生成堆栈跟踪。它的文档记录很差,但它已经存在了很长时间并且使用起来非常安全。 cluck
并且分别confess
是公正warn longmess
的die longmess
。
使用的优点longmess()
是Carp 有几个全局变量来控制它认为是“内部”的内容。这有效地阻止了它们出现在堆栈跟踪中。你关心的两个是@CARP_NOT
和%Carp::Internal
。您应该使用哪个取决于您的日志记录方式。
@CARP_NOT
仅影响源自 set 的包的堆栈跟踪@CARP_NOT
。所以你可以这样写你的记录器:
package MyLogger;
use Carp;
our @CARP_NOT = qw(MyLogger Moose More::Moose::Stuff);
sub trace {
# For example...
warn Carp::longmess("Trace message");
}
MyLogger::trace()
应该报告一条跟踪消息,但忽略它本身、Moose 以及您放入的任何其他内容@CARP_NOT
。
%Carp::Internal
有点像这个的全球版本。如果您无法将 Carp 函数的调用位置集中到日志记录包中,则可以将包添加到%Carp::Internal
. 不幸的是,这是全局的,并且存在设置全局变量的所有问题。如果您要弄乱它,请务必将包添加到它,例如$Carp::Internal{"Some::Module"}++
. 不要像%Carp::Internal = ("Some::Module" => 1)
.