Как я могу перенаправить вывод функции die в файл в Perl?

Я хочу перенаправить сообщения die в отдельный файл, чтобы позже сравнить этот файл и определить, что пошло не так.

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

$ 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> от вызывающего абонента. Есть ли способ перенаправить их из сценария?


person Lazer    schedule 15.10.2010    source источник


Ответы (3)


Perl die печатает в STDERR, поэтому вы можете перенаправить STDERR в файл.

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

open(STDERR, ">>", "errlog.log");
die "Hello";
person wkl    schedule 15.10.2010
comment
Это также перенаправляет сообщения warn(), предупреждения и все остальное, напечатанное в STDERR. Мало того, если кто-то сделал это правильно, переопределив обработчик DIE, он может даже не перенаправлять сообщения die(). - person brian d foy; 15.10.2010

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

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

Подробнее см. $SIG{expr} в perlvar.

person Eugene Yarmash    schedule 15.10.2010

Модуль 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;

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

person Zaid    schedule 15.10.2010