首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Log4perl日志中捕获Perl警告?

如何在Log4perl日志中捕获Perl警告?
EN

Stack Overflow用户
提问于 2010-01-18 01:10:08
回答 2查看 3.5K关注 0票数 13

Log4perl是一个很好的日志记录工具。

warnings杂注也是一个必不可少的工具。

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

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

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

代码语言:javascript
复制
#!/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;

这仍然打印到STDERR:

代码语言:javascript
复制
"my" variable $foo masks earlier declaration in same scope at log.pl line 27.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-18 01:23:48

它在Log4perl常见问题解答中的名称是Some module prints messages to STDERR. How can I funnel them to Log::Log4perl?My program already uses warn() and die(). How can I switch to Log4perl?

您的特定问题增加了一个问题,即您看到了一个编译时警告,因此您需要调整FAQ建议,以便尽早在编译时设置日志。在尽可能靠近源代码顶部的BEGIN块中执行此操作:

代码语言:javascript
复制
 BEGIN {
     ... all of your logging setup
     }

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

代码语言:javascript
复制
 % perl -cw program

如果您在语法检查过程中看到该警告,则这是一个编译时警告。

不过,我更愿意在开发过程中捕获编译时警告。他们不应该进入生产系统。:)

票数 10
EN

Stack Overflow用户

发布于 2010-01-18 01:21:27

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

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

如果您的程序已经使用Perl的warn()函数发出错误消息,并且您希望将这些消息导入Log4perl世界,那么只需在您的程序或模块所在的位置定义一个WARN处理程序:

代码语言:javascript
复制
use Log::Log4perl qw(:easy);
$SIG{__WARN__} = sub {
    local $Log::Log4perl::caller_depth =
        $Log::Log4perl::caller_depth + 1;
    WARN @_;
};

这将捕获程序中对warn的任何显式使用,以及有关使用未初始化值的Perlish警告等。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2081822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档