gpt4 book ai didi

perl - 在 Catalyst 中使用 Plack::Middleware 兼容异常时缺少日志输出

转载 作者:行者123 更新时间:2023-12-02 04:55:35 27 4
gpt4 key购买 nike

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

为了向我的 Catalyst REST 接口(interface)的客户端提供错误消息,我实现了一个 code 子例程,它提供 http 状态代码作为我的异常类的一部分。这样,我想使用 Plack::Middleware,如 Plack::Middleware::HTTPExceptions 的 pod 文档中所述。

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

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

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

我如何告诉 Catalyst 继续记录请求,即使必须将异常重新抛给中间件?

最佳答案

这个问题似乎分为两部分,但我认为这涵盖了它。这实际上更像是一个设置 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 类型类,还有一些额外的细节需要添加。

关于perl - 在 Catalyst 中使用 Plack::Middleware 兼容异常时缺少日志输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com