Do you know if is there any easy way to send output of every check run by nagios to syslog?
2 Answers
I wrote a small script which can be used as a notification and / or event handler. This was beneficial at the time since I did not want to log soft error states and the build I was working with could not separate the two. It also provides some formatting options.
This is easy to use by adding a user syslog with the notify-by-syslog options defined. Simply add this user as a contact whereever you want a specific service to log to syslog.
The Nagios command in the config file:
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$"
}
The send_syslog.pl script
#!/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;
}
-
Thanks! this was what I finally did too, although my scripts is in bash to reduce overhead (we have LOTS of services monitored).– MattDec 20, 2011 at 11:45
Did you set up the use_syslog
option in Nagios configuration?
http://nagios.sourceforge.net/docs/nagioscore/3/en/configmain.html#use_syslog