我们使用local2的设施代码从perls脚本发送大量系统日志消息。这在Red Hat上运行得非常好,但在SunOS上,消息似乎没有发送到local2。例如,这是一个最小脚本
#!/usr/bin/perl
use strict;
use warnings;
use Sys::Syslog qw(:DEFAULT :standard :macros);
openlog("", 'ndelay', 'local2');
syslog('info', "ItWorks");
`logger -p local2.info "ItWorks"`;
在这个脚本中,我通过Syslog perl模块和logger命令发送日志。只有第二条消息显示为local2。我认为它不会转向local2的原因是我们在syslog.conf文件中有一个规则设置来转发local2,只有第二个消息被转发。当我查看日志文件中的2条消息时,它们看起来略有不同,我不确定这是否重要
Sep 2 11:41:22 ssapp7001v <150>Sep 2 11:41:22 d336599: ItWorks
Sep 2 11:41:22 ssapp7001v d336599: [ID 702911 local2.info] ItWorks
我还应该补充一点,我在perl代码中尝试了各种组合,使用local2作为字符串,作为常量,在openlog调用和/或syslog调用中指定它。这似乎没有任何区别。我可以使用反引号并调用记录器但这是我的最后一招,因为我必须处理可能不是命令行友好的字符以及为每条日志消息打开新进程的性能。不幸的是,在这台服务器上进行任何配置更改都是不可能的。
答案 0 :(得分:3)
看起来Perl syslog模块在SunOS上存在一些问题。这些问题可能已经修复,但对我来说,更新不是一个选项,因为该服务器由公司的另一个部门拥有。我最终做的只是使用logger命令行实用程序。这远非理想,但确实有效。这里的代码关闭了每个调用的记录器,但它可以很容易地保持打开状态。保持开放的问题在于你无法改变严重程度。
open(my $fh, "| logger -p $facility.$severityName");
print $fh $logmsg . "\n";
close($fh);
另一个选项是调用syslog API,但我有点过了这个,只需要在这个阶段工作的东西: - )