2013-09-26 177 views
6

trong máy chủ giai đoạn của tôi Tôi muốn kích hoạt gỡ lỗi để khách hàng có thể tìm thấy lỗi cho chính họ trước khi ứng dụng đi đến máy chủ sản xuất.Màn hình gỡ lỗi chi tiết hơn trong Catalyst?

NHƯNG Tôi chỉ muốn phần đầu tiên của thư chứ không phải Yêu cầu hoặc Dữ liệu phiên.

Ví dụ: Không thể hiển thị mẫu "mẫu/home.tt2: lỗi tệp - mẫu/inc/nóng: không tìm thấy".

Tin nhắn là đủ cho tôi và cho khách hàng của tôi thấy rằng cuộc gọi "tiêu đề" bị viết sai chính tả.

Yêu cầu có rất nhiều thông tin không liên quan cho khách hàng, nhưng cũng có rất nhiều thông tin phát triển nội bộ cần được ẩn tất cả thời gian !!

Trân

Trả lời

3

gì bạn muốn là để ghi đè phương pháp dump_these Catalyst của. Điều này trả về một danh sách các thứ để hiển thị trên trang gỡ rối lỗi của Catalyst.

Việc thực hiện mặc định trông giống như:

sub dump_these { 
    my $c = shift; 
    [ Request => $c->req ], 
    [ Response => $c->res ], 
    [ Stash => $c->stash ], 
    [ Config => $c->config ]; 
} 

nhưng bạn có thể làm cho nó chặt chẽ hơn, ví dụ

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

Bạn sẽ xác định dump_these trong mô-đun chính của ứng dụng của bạn - một trong những nơi bạn use Catalyst .

+0

Tuyệt vời !, nhưng trong tệp MyApp.pm thông thường, sau "sử dụng Chất xúc tác ..." tất cả những gì tôi có là cấu hình gói, như __PACKAGE __-> config (encoding => 'UTF-8') Vì vậy, tôi không biết làm thế nào để chèn ở đây một chương trình con. Tôi đã cố gắng dán mã như nó, chỉ trong trường hợp nó đổ chuông, nhưng nó không hoạt động. – MIguelele

+1

Điều đó đúng. Sau đó, bạn muốn 'dump_these' được định nghĩa trong gói' MyApp'. Nếu bạn không chắc chắn gói này thuộc về cái gì, và bạn có thể chấp nhận một cảnh báo 'Subroutine redefined ...', bạn cũng có thể định nghĩa nó như 'sub Catalyst :: dump_these {...}'. – mob

+0

Xin chào, @ mob, tôi đã thử lại. Bây giờ tôi có thể loại bỏ các khối Stash và Config. Tôi có thể thêm các khối như đề xuất "Xin lỗi" của bạn. Nhưng nếu tôi loại bỏ (hoặc chỉ thay đổi) Response, màn hình gỡ lỗi xuất hiện, nhưng trong giao diện điều khiển tôi nhận được một ngoại lệ trong động cơ 'Không thể gọi phương thức" trạng thái "trên một giá trị không xác định ...'. Nếu tôi loại bỏ khối yêu cầu tôi nhận được một ngoại lệ sụp đổ tổng số, không có màn hình và phương pháp 'Không thể gọi phương thức '" ... '. Bất kì lời đề nghị nào? – MIguelele

1

Tôi gặp sự cố tương tự mà tôi đã giải quyết bằng cách ghi đè phương pháp Catalyst log_request_parameters.

Something như thế này (như @mob nói, đặt nó trong mô-đun chính của bạn):

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); 
} 

Nhưng bạn cũng có thể chỉ đơn giản là trở lại ngay từ đầu, nếu bạn không muốn bất kỳ thông số GET/POST hiển thị .

0

Vâng, tôi không nghĩ về giải pháp rõ ràng hơn, trong trường hợp của bạn: bạn có thể chỉ cần đặt mức nhật ký của mình thành một cái gì đó cao hơn debug, điều này sẽ ngăn các nhật ký này hiển thị, nhưng sẽ giữ các nhật ký 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; 
}