2010-10-15 5 views
7

Я хочу перенаправить сообщения die в отдельный файл, чтобы впоследствии сравнить этот файл, чтобы определить, что пошло не так.Как я могу перенаправить вывод функции die в файл в Perl?

Но этот код дает мне ошибки:

$ 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. 
$ 

Я не хочу, чтобы сделать 2> от вызывающего абонента. Есть ли способ перенаправить их из сценария?

ответ

9

Perl's die печатает до STDERR, так что вы можете перенаправить STDERR в файл.

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

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

Это также перенаправляет предупреждения(), предупреждения и все, что было напечатано в STDERR. Не только это, если кто-то сделал это правильно, переопределив обработчик __DIE__, он может даже не перенаправлять сообщения die(). –

12

Вы можете установить обработчик $SIG{__DIE__} для запуска непосредственно перед тем, как «умирает». Обработчик будет вызываться с сообщением об ошибке, которое вы можете войти:

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

См $SIG{expr} в perlvar для деталей.

+0

+1, намного лучше/более гибким, чем мой метод. – birryree

9

Модуль Log::Log4perl предлагает больше, чем несколько вариантов.

Можно выбрать вывод сообщения об ошибке как в файл STDERR, так и в файл журнала.

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; 

Хотя требуется немного больше усилий с точки зрения настройки, его гибкость открывает большой потенциал.

 Смежные вопросы

  • Нет связанных вопросов^_^