Perl Catalyst中更详细的调试屏幕?

Perl Catalyst中更详细的调试屏幕?,perl,catalyst,template-toolkit,Perl,Catalyst,Template Toolkit,在我的阶段服务器中,我想激活调试,以便客户端可以在应用程序进入生产服务器之前自行查找错误 但我只想要消息的第一部分,而不是请求或会话数据。 例如:无法呈现模板“templates/home.tt2:文件错误-templates/inc/heater:未找到” 该消息足以让我和我的客户看到“header”调用拼写错误 请求中有很多与客户端无关的信息,但也有很多内部开发信息,这些信息应该一直隐藏 关于您想要的是覆盖Catalyst的方法。这将返回要在Catalyst的错误调试页面上显示的内容列表 默

在我的阶段服务器中,我想激活调试,以便客户端可以在应用程序进入生产服务器之前自行查找错误

但我只想要消息的第一部分,而不是请求或会话数据。

例如:无法呈现模板“templates/home.tt2:文件错误-templates/inc/heater:未找到”

该消息足以让我和我的客户看到“header”调用拼写错误

请求中有很多与客户端无关的信息,但也有很多内部开发信息,这些信息应该一直隐藏


关于

您想要的是覆盖Catalyst的方法。这将返回要在Catalyst的错误调试页面上显示的内容列表

默认实现如下所示:

sub dump_these {
    my $c = shift;
    [ Request => $c->req ],
    [ Response => $c->res ],
    [ Stash => $c->stash ],
    [ Config => $c->config ];
}
但你可以让它更具限制性,例如

sub dump_these {
    my $c = shift;
    return [ Apology => "We're sorry that you encountered a problem" ],
           [ Response => substr($c->res->body, 0, 512) ];
}

您可以在应用程序的主模块中定义
dump\u这些
——您使用Catalyst的模块

我遇到了一个类似的问题,我通过覆盖Catalyst方法
日志请求\u参数
解决了这个问题

类似这样的内容(正如@mob所说,将其放在您的主模块中):


但是如果不想显示任何GET/POST参数,您也可以在开始时简单地返回。

好吧,我没有想到更明显的解决方案,在您的情况下:您可以简单地将日志级别设置为高于
debug
,这将阻止显示这些
debug
日志,但会保留
错误
日志:

# (or a similar condition to check you are not on the production server)
if ( !__PACKAGE__->config->{dev} ) {
    __PACKAGE__->log->levels( 'warn', 'error', 'fatal' ) if ref __PACKAGE__->log;
}

伟大的但是在通常的MyApp.pm文件中,在“使用Catalyst…”之后,我只有包配置,比如package->config(encoding=>'UTF-8'),所以我不知道如何在这里插入子例程。我试着按原样粘贴代码,以防万一它响了,但它不起作用。这应该是正确的。然后您需要
dump\u这些
MyApp
包中定义的
。如果您不确定此方法属于哪个包,并且您可以容忍一个
子例程重定义…
警告,您也可以像
sub-Catalyst::dump_this{…}
一样定义它。您好,@mob,我重试了。现在我可以删除隐藏和配置块了。我可以添加块,比如你的“道歉”建议。但如果我删除(或只是更改)响应,则会出现调试屏幕,但在控制台中,我在engine
无法对未定义的值调用方法“status”时遇到异常…
。如果我删除请求块,我会得到一个完全崩溃异常,没有屏幕,
无法调用方法“method”…
。有什么建议吗?嗯。Catalyst中的
log\u请求
log\u响应
方法也使用
dump\u这些
方法,并期望获得
请求
响应
的值。下一个建议:在
Catalyst::Engine
模块中,破解
finalize\u error
\u dump\u error\u page\u元素
方法。
# (or a similar condition to check you are not on the production server)
if ( !__PACKAGE__->config->{dev} ) {
    __PACKAGE__->log->levels( 'warn', 'error', 'fatal' ) if ref __PACKAGE__->log;
}