【问题标题】:Less verbose debug screen in Catalyst?Catalyst 中不那么冗长的调试屏幕?
【发布时间】:2013-10-02 17:49:15
【问题描述】:

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

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

例如:无法渲染模板“templates/home.tt2: file error - templates/inc/heater: not found”。

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

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

问候

【问题讨论】:

    标签: perl catalyst template-toolkit


    【解决方案1】:

    您想要的是覆盖 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

    【讨论】:

    • 太棒了!但是在通常的 MyApp.pm 文件中,在“使用 Catalyst...”之后,我所拥有的只是包配置,例如 PACKAGE->config( 编码=> 'UTF-8' ) 所以我不知道如何在这里插入一个子程序。我试图按原样粘贴代码,以防它响铃,但它不起作用。
    • 应该没错。然后你会想要在MyApp 包中定义dump_these。如果您不确定此方法属于哪个包,并且您可以容忍Subroutine redefined ... 警告,您也可以将其定义为sub Catalyst::dump_these { ... }
    • 嗨,@mob,我又试了一次。现在我可以删除 Stash 和 Config 块。我可以像你的“道歉”建议一样添加块。但是,如果我删除(或只是更改)响应,则会出现调试屏幕,但在控制台中,我在引擎 Can't call method "status" on an undefined value... 中出现异常。如果我删除请求块,我会得到一个完全崩溃的异常,没有屏幕和Can't call method "method"...。有什么建议吗?
    • 嗯。 Catalyst 中的log_requestlog_response 方法也使用dump_these 并期望返回RequestResponse 的值。下一个建议:破解Catalyst::Engine 模块中的finalize_error_dump_error_page_element 方法。
    【解决方案2】:

    我有一个类似的问题,我通过覆盖 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 参数,您也可以简单地在开头返回。

    【讨论】:

      【解决方案3】:

      好吧,在你的情况下,我没有想到更明显的解决方案:你可以简单地将你的日志级别设置为高于 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 2015-10-31
        • 1970-01-01
        • 2015-09-05
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 1970-01-01
        相关资源
        最近更新 更多