Как перенаправить вывод функции die в файл на Perl? - PullRequest
7 голосов
/ 15 октября 2010

Я хочу перенаправить сообщения 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> от звонящего. Есть ли способ перенаправить их из скрипта?

Ответы [ 3 ]

15 голосов
/ 15 октября 2010

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

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

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

10 голосов
/ 15 октября 2010

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

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

open(STDERR, ">>", "errlog.log");
die "Hello";
9 голосов
/ 15 октября 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;

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

...