Как я могу перенаправить вывод функции 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;
Хотя это требует немного больше усилий с точки зрения настройки, его гибкость раскрывает большой потенциал.