2012-10-08 2 views
2

Existe-t-il un moyen dans log4Perl que je peux forcer mes programmes à se connecter fatale même en dehors d'une clause eval? Je veux parvenir à appeler log4perl également dans le cas de toute résiliation de programme non gérée. Préférentiellement, je voudrais ajouter le gestionnaire d'erreurs associé dans mon module standard qui est chargé avec tous mes programmes Perl.
La version Perl est actuellement de 5,8, mais je vais bientôt la mettre à niveau.
Ceci est le code de test pour la réponse donnée. Je ne vois ni un DIE sur l'écran ni que die.txt est créé.Perl: Log4Perl appel log4perl en cas d'erreur non gérée

use Log::Log4perl qw(get_logger); 
$a->test(); 
$SIG{__DIE__} = sub { 
warn "DIE"; 
open DIE,">die.txt"; 
print DIE "died\n"; 
close DIE; 
}; 
+0

Utilisez les apostrophes inverses autour de « masque », souligne dans les commentaires (les transformer dans le code où aucun formatage est autorisé). // Répondre à un commentaire à une question supprimée. – ZyX

+1

Votre problème est que '$ SIG {__ DIE __}' n'a pas encore été défini au moment où votre erreur se produit. Réglez simplement $ SIG {__ DIE __} 'd'abord, ensuite cela fonctionnera. – dan1111

Répondre

4

On dirait la FAQ How can I make sure my application logs a message when it dies unexpectedly?

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; 
    } 
    local $Log::Log4perl::caller_depth = 
      $Log::Log4perl::caller_depth + 1; 
    my $logger = get_logger(""); 
    $logger->fatal(@_); 
    die @_; # Now terminate really 
}; 

Voir perlipc pour plus

+0

Ceci aide dans le cas où die est appelé, mais pas quand il y a une exception non gérée - par ex. appeler une méthode sur une valeur undef. – weismat

+0

Comment voyez-vous? En voici une démo fonctionnant 'perl -e" $ SIG {__ DIE__} = sub {avertir joindre q//, 666, @_}; $ foo-> quoi; "' –

+0

J'ai écrit un petit programme et juste appelé print , avertir et aussi juste essayé de créer/écrire dans un fichier d'erreur. – weismat

Questions connexes