2010-10-15 15 views
7

Ich möchte die die Nachrichten in eine separate Datei umleiten, so dass ich diese Datei später vergleichen kann, um festzustellen, was schief gelaufen ist.Wie kann ich die Ausgabe der Funktion in eine Datei in Perl umleiten?

Aber dieser Code gibt mir Fehler:

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

Ich möchte nicht über eine 2> von dem Anrufer zu tun. Gibt es eine Möglichkeit, sie aus dem Skript umzuleiten?

Antwort

9

Perl die druckt auf STDERR, so dass Sie STDERR in eine Datei umleiten können.

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

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

Dies leitet auch WARN() - Nachrichten, Warnungen und alles, was sonst noch gedruckt wird, an STDERR weiter. Wenn jemand dies richtig gemacht hat, indem er den __DIE__-Handler neu definiert hat, kann es nicht einmal die dieie() - Nachrichten umleiten. –

12

Sie können einen $SIG{__DIE__} Handler installieren, der ausgeführt werden soll, kurz bevor der "Die" ausgeführt wird. Der Handler wird mit der Fehlermeldung genannt werden, die Sie sich anmelden können:

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

Siehe $SIG{expr} in perlvar für weitere Einzelheiten.

+0

+1, viel besser/flexibler als meine Methode. – birryree

9

Das Log::Log4perl Modul bietet mehr als ein paar Optionen.

Man kann wählen, die Fehlermeldung sowohl auf STDERR als auch auf die Logdatei auszugeben.

Obwohl es ein bisschen mehr Aufwand in Bezug auf die Einrichtung erfordert, bietet seine Flexibilität viel Potenzial.

Verwandte Themen