使用Perl发送syslog消息

3
我们正在使用本地2的设施代码从Perl脚本发送大量的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,只有第二个消息被转发了。当我查看日志文件中的两条消息时,它们看起来略有不同,我不确定这是否重要。
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调用中指定它。但是似乎没有任何区别。我可以使用反引号并调用logger,但那是我的最后一个选择,因为我必须处理可能不符合命令行规范的字符,而且还要为每个日志消息打开一个新进程,这会影响性能。不幸的是,在这个服务器上进行任何配置更改都是不可能的。

1个回答

3

看起来Perl syslog模块在SunOS上存在一些问题。这些问题可能已经被修复,但对我来说更新不是一个选项,因为这个服务器是公司的另一个部门拥有的。我最终使用了logger命令行实用程序。虽然这远非理想,但确实可行。这里的代码为每个调用关闭了记录器,但它很容易保持打开状态。保持打开的问题是您无法更改严重性。

open(my $fh, "| logger -p $facility.$severityName");
print $fh $logmsg . "\n";
close($fh);

另一个选择是调用syslog API,但我有点厌烦了,现在只需要一些可用的东西 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接