Как я могу перенаправить вывод функции 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> от звонящего. Есть ли способ перенаправить их изнутри скрипта?

3 ответа

Решение

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

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

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

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

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

Смотрите $SIG{expr} в perlvar для подробностей.

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;

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

Другие вопросы по тегам