perl Catalyst?中的调试屏幕更简洁

wh6knrhe  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(116)

在我的stage服务器中,我想激活调试,以便客户端可以在应用程序进入生产服务器之前自己发现错误。

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

例如:无法呈现模板“templates/home.tt2”:文件错误-模板/inc/加热器:未找到”。
该消息足以让我和我的客户看到“header”调用拼写错误。
请求有很多与客户无关的信息,但也有很多内部开发信息,应该一直隐藏!!
此致

dzhpxtsq

dzhpxtsq1#

您需要的是覆盖Catalyst的dump_these方法。这将返回一个列表,显示在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_these--也就是use Catalyst所在的模块。

dojqjjoe

dojqjjoe2#

我有一个类似的问题,我通过覆盖Catalyst方法log_request_parameters解决了这个问题。
类似这样的东西(正如@mob所说,把它放在你的主模块中):

sub log_request_parameters {
    my $c          = shift;
    my %all_params = @_; 

    my $copy = Clone::clone(\%all_params);  # don't change the 'real' request params

    # Then, do anything you want to only print what matters to you,
    # for example, to hide some POST parameters:
    my $body = $copy->{body} || {}; 
    foreach my $key (keys %$body) {
        $body->{$key} = '****' if $key =~ /password/;
    }

    return $c->SUPER::log_request_parameters( %$copy );
}

但是,如果不希望显示任何GET/POST参数,也可以在开始时返回。

ccrfmcuu

ccrfmcuu3#

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

# (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;
    }

相关问题