2010-10-15 15 views
7

Chcę przekierować wiadomości die do osobnego pliku, aby móc później porównać ten plik, aby ustalić, co poszło nie tak.Jak mogę przekierować wyjście funkcji kości do pliku w Perlu?

Ale ten kod daje mi błędy:

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

nie chcę zrobić 2> od rozmówcy. Czy jest jakiś sposób, aby je przekierować z poziomu skryptu?

Odpowiedz

9

Drukuje die Perla do STDERR, więc możesz przekierować STDERR do pliku.

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

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

Powoduje to również przekierowanie komunikatów ostrzegawczych, ostrzeżeń i wszystkiego, co zostało wydrukowane na STDERR. Co więcej, jeśli ktoś zrobił to poprawnie, redefiniując program obsługi __DIE__, może nawet nie przekierować wiadomości die(). –

12

Możesz zainstalować program obsługi $SIG{__DIE__} do uruchomienia tuż przed uruchomieniem "matrycy". Moduł obsługi zostanie wywołana z komunikatem o błędzie, który można zalogować:

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

Zobacz $SIG{expr} w perlvar szczegóły.

+0

+1, znacznie lepiej/bardziej elastycznie niż moja metoda. – birryree

9

Moduł Log::Log4perl oferuje więcej niż kilka opcji.

Można wybrać wyjście komunikatu o błędzie zarówno do STDERR, jak i do pliku dziennika.

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; 

Chociaż wymaga nieco więcej wysiłku w zakresie konfiguracji, jego elastyczność otwiera ogromny potencjał.

Powiązane problemy