2017-01-11 1 views
4

Ich möchte ein Protokoll für mein Perl-Skript erstellen. Aber wenn ich Log::Log4perl verwende, wie kann ich die Fehler erfassen, die vom Skript in jedem Fall geworfen werden. Wie man das in die Protokolldatei einträgt. Derzeit wird alles, was ich explizit in Variablen wie ERROR(), DEBUG() usw. schreibe, die einzigen sein, die in die Protokolldatei gedruckt werden.Protokollieren Sie alle unerwarteten Fehler mithilfe von Log :: Log4perl

Gibt es eine Möglichkeit, dies mit Log :: Log4perl zu tun.

zum Beispiel in dem folgenden Code:

use strict; 
use warnings; 
use Log::Log4perl qw(:easy); 

Log::Log4perl->easy_init({ level => $DEBUG, 
          file => ">>test.log" }); 

my $logger = Log::Log4perl->get_logger();       

$logger->fatal("This is", " fatal"); 
$logger->error("This is error"); 
$logger->warn( "This is warn"); 
$logger->info( "This is info"); 
$logger->debug("This is debug"); 
$logger->trace("This is trace"); 

my $a = 10; 

my $b = $a/0; 

Die Division durch Null Fehler wird an das Skript nicht angemeldet. Mein ursprüngliches Skript ist zu komplex, um nach jedem Fehler zu suchen, also möchte etwas, das den Fehler in stderr protokolliert, auch zur Protokolldatei.

Antwort

3
use Log::Log4perl qw(get_logger); 

$SIG{__DIE__} = sub { 
    if($^S) { 
     # We're in an eval {} and don't want log 
     # this message but catch it later 
     return; 
    } 
    $Log::Log4perl::caller_depth++; 
    my $logger = get_logger(""); 
    $logger->fatal(@_); 
    die @_; # Now terminate really 
}; 

Siehe auch Log4perl - how can I make sure my application logs a message when it dies unexpectedly?

+0

Wann wir das, wenn Block im Unter oben eingeben. Da ich immer nur will, dass ein Fehler auftritt, der die Anwendung zum Absturz bringt, möchte ich sie protokollieren und die Ausführung des Skripts stoppen. – Mohit

+0

@Mohit: '$^S' gibt wahr zurück, wenn ein' eval' ausgeführt wird. –

Verwandte Themen