3

我们使用 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 调用中指定它。这些似乎都没有任何区别。我可以只使用反引号并调用记录器,但这是我最后的手段,因为我必须处理可能对命令行不友好的字符以及为每条日志消息打开一个新进程的性能损失。不幸的是,在此服务器上进行任何配置更改是不可能的。

4

1 回答 1

3

看起来 Perl 系统日志模块在 SunOS 上存在一些问题。这些问题可能已经解决,但对我来说更新不是一种选择,因为该服务器归公司的另一个部门所有。我最终做的只是使用 logger 命令行实用程序。这远非理想,但确实有效。此处的代码会为每个调用关闭记录器,但它可以很容易地保持打开状态。保持打开状态的问题是您无法更改严重性。

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

另一种选择是调用 syslog API,但我对此有点过头了,只需要在这个阶段可以工作的东西:-)

于 2013-09-09T04:57:51.653 回答