我们使用local2的设备代码从perls脚本发送了大量syslog消息。这在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调用中指定它。这些似乎都没有任何区别。我可以只使用backticks和调用记录器,但这是我的最后手段,因为我必须处理可能对命令行不友好的字符,此外还必须为每条日志消息打开一个新进程。不幸的是,在此服务器上进行任何配置更改都是不可能的。
看起来Perl系统日志模块在SunOS上有一些问题。这些问题可能已经解决,但对我来说,更新不是一个选项,因为该服务器由公司的另一个部门所有。我最终所做的只是使用logger命令行实用程序。这远非理想,但确实有效。这里的代码为每个调用关闭记录器,但它可以很容易地保持打开状态。保持它打开的问题是你无法改变严重性。
open(my $fh, "| logger -p $facility.$severityName");
print $fh $logmsg . "n";
close($fh);
另一个选项是调用syslog API,但我对此有点了解,只需要在现阶段工作的东西:-)