如何将Logl警告捕获到Log4perl日志中?

Fre*_*die 13 perl log4perl

Log4perl是一个很棒的日志工具.

警告编译也是一个必不可少的工具.

但是,当Perl脚本作为守护程序运行时,Perl警告会打印到STDERR中,没有人可以看到它们,而不会打印到相关程序的Log4perl日志文件中.

有没有办法将Perl警告捕获到Log4perl日志中?

例如,此代码将很好地记录到日志文件中,但是如果它作为守护程序运行,则Perl警告将不会包含在日志中:

#!/usr/bin/env perl
use strict;
use warnings;

use Log::Log4perl qw(get_logger);

# Define configuration
my $conf = q(
                log4perl.logger                    = DEBUG, FileApp
                log4perl.appender.FileApp          = Log::Log4perl::Appender::File
                log4perl.appender.FileApp.filename = test.log
                log4perl.appender.FileApp.layout   = PatternLayout
);

# Initialize logging behaviour
Log::Log4perl->init( \$conf );

# Obtain a logger instance
my $logger = get_logger("Foo::Bar");
$logger->error("Oh my, an error!");

$SIG{__WARN__} = sub {
    #local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
    $logger->warn("WARN @_");
};

my $foo = 100;
my $foo = 44;
Run Code Online (Sandbox Code Playgroud)

这仍然打印到STDERR:

"my" variable $foo masks earlier declaration in same scope at log.pl line 27.
Run Code Online (Sandbox Code Playgroud)

并且日志文件不会捕获此警告.

mar*_*ton 15

您可以安装一个WARN处理程序来执行此操作.它在Log4perl FAQ中提到过.

我的程序已经使用warn()和die().如何切换到Log4perl?

如果你的程序已经使用Perl的warn()函数来表示错误消息,并且你想将它们引导到Log4perl世界,那么只需定义一个程序或模块所在的WARN处理程序:

use Log::Log4perl qw(:easy);
$SIG{__WARN__} = sub {
    local $Log::Log4perl::caller_depth =
        $Log::Log4perl::caller_depth + 1;
    WARN @_;
};
Run Code Online (Sandbox Code Playgroud)

这将捕获warn您的程序中的任何明确使用,以及有关使用未初始化值等的Perlish警告.


bri*_*foy 10

它位于Log4perl FAQ中,因为某些模块将消息打印到STDERR.我怎样才能将它们汇集到Log :: Log4perl?我的程序已经使用警告()和死亡().如何切换到Log4perl?.

您遇到的编译时警告会增加您的特定问题,因此您需要调整FAQ建议,以便尽早在编译时设置日志记录.BEGIN尽可能在靠近源顶部的块中执行此操作:

 BEGIN {
     ... all of your logging setup
     }
Run Code Online (Sandbox Code Playgroud)

您可以通过运行启用了警告的语法检查来判断它是否是编译时警告:

 % perl -cw program
Run Code Online (Sandbox Code Playgroud)

如果在语法检查期间看到警告,则为编译时警告.

我宁愿抓住开发中的编译时警告.他们不应该通过生产系统.:)