这个问题似乎有两个部分,但我认为这涵盖了它。实际上更多的是设置 Log4perl 来记录错误的问题,但是有 Catalyst 和 Plack 的注意事项。
首先,这是一个典型的 log4perl 配置设置:
log4perl.logger = DEBUG, FileAppndr, Screen, DebugPanel
log4perl.appender.FileAppndr = Log::Log4perl::Appender::File
log4perl.appender.FileAppndr.filename = log/server.log
log4perl.appender.FileAppndr.autoflush = 1
log4perl.appender.FileAppndr.stderr = 1
log4perl.appender.FileAppndr.layout = PatternLayout
log4perl.appender.FileAppndr.layout.ConversionPattern=%d [%p] - %m%n
log4perl.appender.Screen = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.stderr = 1
log4perl.appender.Screen.autoflush = 1
log4perl.appender.Screen.layout = PatternLayout
log4perl.appender.Screen.layout.ConversionPattern=%d [%p] - %m%n
请注意将其中的stderr
值包含为1
。所以这告诉 log4perl 捕获stderr
日志记录。
在 Catalyst 方面,我实际上为上下文设置了一些非常自定义的初始化代码,但基本上设置了两件事;
基本上通过将上下文记录器设置为Log::Log4perl::Catalyst$c->log
加载 PSGI 中间件Plack::Middleware::Log4perl。我实际上是psgi_middleware
在加载催化剂配置时通过配置键执行此操作的。所以配置行中没有比“Log4perl”更多的东西,因为一切都已经在“Plack::Middleware”上下文路径中了。
第二部分将“拾取”加载的“log4perl”实例并分配给 ,psgi.logger
以便任何 PSGI 组件都可以根据需要访问记录器。
那么,任何稍后将在代码中“重新抛出”的语句,例如:
my $e = HTTP::Exception->new(404);
$e->status_message("BOOM!!");
$e->throw;
实际上将在“log4perl”输出以及任何原始die
语句中提取。
至少 Catalyst 5.90060 及更高版本是这种情况。关于 HTTP::Exception 类型类,还有一些额外的细节需要添加。