3

对于我的Catalyst项目,我使用的是基于自己Moose的异常类型,它Catalyst与我的命令行应用程序兼容。

为了向我的 Catalyst REST 接口的客户端提供错误消息,我实现了一个code子例程,它提供 http 状态代码作为我的异常类的一部分。这样,我想Plack::Middleware按照Plack::Middleware::HTTPExceptions.

一切正常。异常以我希望它们返回的方式返回给客户端。

我的问题是:每当我抛出一个被中间件捕获的异常时,我的日志记录 ( ) 就会丢失,并且我在的 web 服务器 perl 脚本输出Log::Log4perl中既找不到踪迹也找不到错误。Catalyst

每当我抛出没有被我的异常类封装的错误,而是罕见的字符串(如die "BOOM!")时,就会写入日志输出并记录错误(显然,错误被捕获Catalyst并且不会重新抛出)。

Catalyst即使必须将异常重新抛出到中间件,我如何才能告诉保持记录请求?

4

2 回答 2

0

尽管 Neil 的回答包含我应用于 Catalyst 应用程序的几个正确陈述,但我没有得到任何输出。我通过子类来解决这个问题Catalyst::Engine。该子类仅重新定义finalize_error,其余功能保持不变。在找到我自己的异常类型的情况下,我设置了一个单独的响应正文和状态代码,以通过重新抛出异常“梯子向上”来达到与我相同的结果。

于 2014-05-22T11:23:43.977 回答
0

这个问题似乎有两个部分,但我认为这涵盖了它。实际上更多的是设置 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 方面,我实际上为上下文设置了一些非常自定义的初始化代码,但基本上设置了两件事;

  1. 基本上通过将上下文记录器设置为Log::Log4perl::Catalyst$c->log

  2. 加载 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 类型类,还有一些额外的细节需要添加。

于 2014-03-31T01:42:59.933 回答