4

我想为我的 Perl 脚本生成一个日志。但是当我使用Log::Log4perl时,我如何才能捕获脚本在任何情况下都会抛出的错误。如何将其记录到日志文件中。目前,我在 ERROR()、DEBUG() 等各种标签中明确写入的任何内容都是唯一打印到日志文件的标签。

有没有办法使用 Log::Log4perl 来做到这一点。

例如在下面的代码中:

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; 

除以零错误不会记录到脚本中。我的原始脚本太复杂,无法检查每个错误,所以需要一些将 stderr 上的错误也记录到日志文件的东西。

4

1 回答 1

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

另请参阅Log4perl - 我如何确保我的应用程序在意外死亡时记录一条消息?

于 2017-01-11T10:08:27.233 回答