您是否知道是否有任何简单的方法可以将 nagios 运行的每次检查的输出发送到 syslog?
答案1
我编写了一个小脚本,可以用作通知和/或事件处理程序。这在当时很有用,因为我不想记录软错误状态,而我使用的构建无法将两者分开。它还提供了一些格式化选项。
通过添加带有已定义通知系统日志选项的用户系统日志,此功能非常容易使用。只需在您希望特定服务记录到系统日志时将此用户添加为联系人即可。
配置文件中的 Nagios 命令:
define command{
command_name notify-service-by-syslog
command_line /usr/bin/perl $USER1$/send_syslog.pl \
--state $SERVICESTATE$ --host $HOSTADDRESS$ \
--msg "$HOSTADDRESS$ $SERVICEDESC$ $SERVICESTATE$ $SERVICEOUTPUT$ $LONGSERVICEOUTPUT$" --hard $SERVICESTATETYPE$
}
define command{
command_name notify-host-by-syslog
command_line /usr/bin/perl $USER1$/send_syslog.pl \
--hard $HOSTSTATETYPE$ --state $HOSTSTATE$ --host $HOSTADDRESS$ \
--msg "$HOSTADDRESS$: $HOSTSTATE$ $HOSTOUTPUT$ $LONGHOSTOUTPUT$"
}
send_syslog.pl 脚本
#!/usr/bin/perl -w
use Sys::Syslog qw(:standard :macros);
use strict;
use Getopt::Long;
&Getopt::Long::config('bundling');
my $help;
my $hard;
my $state;
my $host;
my $msg;
get_options();
run_process();
sub run_process
{
if( $hard eq "SOFT" )
{
return 0;
}
my $alert=LOG_DEBUG;
$alert=LOG_EMERG if $state eq "DOWN";
$alert=LOG_INFO if $state eq "UP";
$alert=LOG_CRIT if $state eq "CRITICAL";
$alert=LOG_WARNING if $state eq "WARNING";
$alert=LOG_INFO if $state eq "OK";
openlog('nagios','','daemon');
syslog($alert,"$host $msg");
}
sub get_options
{
GetOptions
("help|h" => \$help,
"hard:s" => \$hard,
"state:s" => \$state,
"host:s" => \$host,
"msg:s" => \$msg
);
if( defined($help) )
{
print "--help called\n\n";
print_usage();
}
}
sub print_usage
{
print "--help | -H: Print this screen\n";
print "--hard <HOSTSTATETYPE|SERVICESTATETYPE>\n";
print " with a SOFT or HARD state; only alerts on the HARD states.\n";
print "--state <HOSTSTATE|SERVICESTATE>";
print "--host <HOSTADDRESS>\n";
print "--msg <Message Body>: Defines the message body to render\n";
exit 1;
}
答案2
use_syslog
您是否在 Nagios 配置中设置了该选项?
http://nagios.sourceforge.net/docs/nagioscore/3/en/configmain.html#use_syslog