2010-10-15 29 views
7

Tôi muốn chuyển hướng các tin nhắn die đến một tệp riêng biệt để tôi có thể so sánh tệp đó sau để xác định xem có vấn đề gì.Làm cách nào để chuyển hướng đầu ra của hàm chết sang một tệp trong Perl?

Nhưng mã này mang lại cho tôi lỗi:

$ cat test.pl 
use strict; 
use warnings; 

my $log = "msglog.log"; 
die $log "DEAD$!"; 

$ perl test.pl 
Missing comma after first argument to die function at test.pl line 5, near ""DEAD$!";" 
Execution of test.pl aborted due to compilation errors. 
$ 

Tôi không muốn làm một 2> từ người gọi. Có cách nào để chuyển hướng chúng từ bên trong tập lệnh không?

Trả lời

9

Perl's die in thành STDERR để bạn có thể chuyển hướng STDERR vào tệp.

#!/usr/bin/env perl 
# the path above depends on your system 

open(STDERR, ">>", "errlog.log"); 
die "Hello"; 
+1

Điều này cũng chuyển hướng cảnh báo() các thông điệp, cảnh báo và bất kỳ thứ gì khác được in tới STDERR. Không chỉ vậy, nếu ai đó đã làm điều này đúng cách bằng cách xác định lại trình xử lý __DIE__, nó có thể thậm chí không chuyển hướng các thông báo die(). –

12

Bạn có thể cài đặt trình xử lý $SIG{__DIE__} để chạy ngay trước khi "chết" chạy. Trình xử lý sẽ được gọi với thông báo lỗi mà bạn có thể đăng nhập:

local $SIG{__DIE__} = sub { 
    my ($message) = @_; 
    # log the message   
}; 

Xem $SIG{expr} trong perlvar để biết chi tiết.

+0

+1, tốt hơn/linh hoạt hơn phương pháp của tôi. – birryree

9

Mô-đun Log::Log4perl cung cấp nhiều tùy chọn.

Người ta có thể chọn xuất thông báo lỗi cho cả STDERR và logfile.

my $logger = Log::Log4perl->init ('log.conf'); 
# Configuration file controls what to output, like time, line number, class... 

$logger->get_logger ('Hello::World'); # Define which class logger to use 

. 
. 
. 

open my $fh, '<', $file 
    or $logger->logdie ("Log the demise: $!"); # ... and die; 

Mặc dù cần nỗ lực nhiều hơn một chút để thiết lập, tính linh hoạt của nó mở ra nhiều tiềm năng.