2017-01-11 1 views
4

Je veux générer un journal pour mon script Perl. Mais quand j'utilise Log::Log4perl comment puis-je capturer les erreurs qui seront lancées par le script dans tous les cas. Comment enregistrer cela dans le fichier journal. Actuellement tout ce que j'écris explicitement dans les balises variouys comme ERROR(), DEBUG() etc. est le seul qui est imprimé dans le fichier journal.Consigner toutes les erreurs inattendues en utilisant Log :: Log4perl

Existe-t-il un moyen de le faire en utilisant Log :: Log4perl.

Par exemple, dans le code ci-dessous:

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; 

La division par zéro erreur n'est pas connecté au script. Le script original de mine est trop complexe pour vérifier chaque erreur ainsi veulent quelque chose qui enregistre l'erreur sur stderr au dossier de notation également.

Répondre

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 
}; 

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

+0

Quand est-ce que nous entrons dans le bloc si dans le sous-dessus. Comme je veux seulement que chaque fois qu'une erreur qui déclenchera l'application se produise, je veux l'enregistrer et arrêter l'exécution du script. – Mohit

+0

@Mohit: '$^S' renvoie vrai lors de l'exécution d'un' eval'. –