perl - Perl 中警告传播的最佳实践

标签 perl logging warnings

是否有既定的最佳实践来处理 Perl 程序中不同类别的警告,例如记录到系统日志(或实际上任何非标准行为)?

例如,向系统日志发送警告:

$SIG{__WARN__} = sub {
    syslog(LOG_ERR,shift);
}

但现在想象一下,并非所有警告都是一样的。有些应该被视为噪音并降级。例如,许多 MIME 警告并不真正表明存在严重问题:

ignoring text in character set `WINDOWS-1252'
at /usr/share/perl5/MIME/Parser/Filer.pm line 659

最好将其记录为 LOG_INFO 或其他一些不会提醒管理员出现问题的优先级。

实现这一目标的最佳方法是什么?

一个简单的解决方案可能是:

$SIG{__WARN__} = sub {
    my $msg = shift;
    my $prio = $msg =~ /(ignoring|Filer.pm)/ ? LOG_INFO : LOG_ERR;
    syslog($prio,$msg)
}

但这需要(IMO)我的代码和它调用的任何库之间的紧密耦合,必须仔细匹配警告消息......而且它也不是很优雅或可维护。

我见过的一个可能的解决方案是,当我控制代码时,它是一个小小的改进,它是确保我的警告都有一个前缀:

warn "MIME parsing error: $@";

这使得警告处理程序更加简单:

$SIG{__WARN__} = sub {
    my $msg = shift;
    my $prio = $msg =~ /^MIME parsing error:/ ? LOG_INFO : LOG_ERR;
    syslog($prio,$msg)
}

但是对警告进行字符串解析以确定其分类似乎仍然不优雅。

有没有更优雅的解决方案?我正在寻找一种通用的最佳实践——即使它需要重写所有发出警告的库。

最佳答案

与异常对象类似,您可以引入警告对象:

$SIG{__WARN__} = sub {
    my $w = shift;
    if ($w->is_info) {
        print STDERR 'INFO:', $w->msg, "\n";
    }
};

warn 'My::Warning'->new( msg      => 'problem',
                         severity => 'info',
                        );

关于perl - Perl 中警告传播的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238069/

相关文章:

perl - 如何扩展二进制搜索迭代器以使用多个目标

perl - 从 Linux 中的文件运行 Perl 脚本

ruby - rack 复制每条日志消息

java - 故障排除 "The type parameter T is hiding the type T"警告

perl - 用 Perl 编写报告

perl - 如何以编程方式确定我的 Perl 程序在 Windows 下的内存使用情况?

iis - 经典 ASP 上的 500 服务器错误 - 无法获得更多详细信息

url - 使用 mapreduce 从日志文件中提取命中计数

c - dprintf 隐式声明警告

c++ - 虚拟继承和委托(delegate)实现