The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Net::Syslogd - Perl implementation of Syslog Listener

SYNOPSIS

  use Net::Syslogd;

  my $syslogd = Net::Syslogd->new()
    or die "Error creating Syslogd listener: %s", Net::Syslogd->error;

  while (1) {
      my $message;
      if (!($message = $syslogd->get_message())) { next }

      if (!(defined($message->process_message()))) {
          printf "$0: %s\n", Net::Syslogd->error
      } else {
          printf "%s\t%i\t%s\t%s\t%s\t%s\t%s\n", 
                 $message->peeraddr, 
                 $message->peerport, 
                 $message->facility, 
                 $message->severity, 
                 $message->time, 
                 $message->hostname, 
                 $message->message
      }
  }

DESCRIPTION

Net::Syslogd is a class implementing a simple Syslog listener in Perl. Net::Syslogd will accept messages on the default Syslog port (UDP 514) and attempt to decode them according to RFC 3164.

METHODS

new() - create a new Net::Syslogd object

  my $syslogd = new Net::Syslogd([OPTIONS]);

or

  my $syslogd = Net::Syslogd->new([OPTIONS]);

Create a new Net::Syslogd object with OPTIONS as optional parameters. Valid options are:

  Option     Description                            Default
  ------     -----------                            -------
  -LocalAddr Interface to bind to                       any
  -LocalPort Port to bind server to                     514
  -Timeout   Timeout in seconds to wait for request      10

get_message() - listen for Syslog message

  $syslogd->get_message();

Listen for a Syslog message. Timeout after default or user specified timeout set in new method and return '0'; else, return is defined.

process_message() - process received Syslog message

  $syslogd->process_message();

Process a received Syslog message by RFC 3164 - or as close as possible. RFC 3164 format is as follows:

  <###>Mmm dd hh:mm:ss hostname tag msg

  |___||_____________|
    |         Time
   Priority

NOTE: This script parses the tag and msg as a single field.

Allows the following methods to be called.

datagram() - return datagram from Syslog message

  $syslogd->datagram();

Return the raw datagram received from a processed (process_message()) Syslog message.

peeraddr() - return remote address from Syslog message

  $syslogd->peeraddr();

Return peer address value from a received and processed (process_message()) Syslog message. This is the address from the IP header on the UDP datagram.

peerport() - return remote port from Syslog message

  $syslogd->peerport();

Return peer port value from a received and processed (process_message()) Syslog message. This is the port from the IP header on the UDP datagram.

priority() - return priority from Syslog message

  $syslogd->priority();

Return priority value from a received and processed (process_message()) Syslog message. This is the raw priority number not decoded into facility and severity.

facility() - return facility from Syslog message

  $syslogd->facility([1]);

Return facility value from a received and processed (process_message()) Syslog message. This is the text representation of the facility. For the raw number, use the optional boolean argument.

severity() - return severity from Syslog message

  $syslogd->severity([1]);

Return severity value from a received and processed (process_message()) Syslog message. This is the text representation of the severity. For the raw number, use the optional boolean argument.

time() - return time from Syslog message

  $syslogd->time();

Return time value from a received and processed (process_message()) Syslog message.

hostname() - return hostname from Syslog message

  $syslogd->hostname();

Return hostname value from a received and processed (process_message()) Syslog message.

message() - return message from Syslog message

  $syslogd->message();

Return message value from a received and processed (process_message()) Syslog message. Note this is the tag and msg field from a properly formatted RFC 3164 Syslog message.

error() - print last error

  printf "Error: %s\n", $Net::Syslogd->error;

Return last error.

EXPORT

None by default.

EXAMPLES

Simple Syslog Server

This example implements a simple Syslog server that listens on the default port and prints received messages to the console.

  use Net::Syslogd;

  my $syslogd = Net::Syslogd->new()
    or die "Error creating Syslogd listener: %s", Net::Syslogd->error;

  while (1) {
      my $message;
      if (!($message = $syslogd->get_message())) { next }

      if (!(defined($message->process_message()))) {
          printf "$0: %s\n", Net::Syslogd->error
      } else {
          printf "%s\t%i\t%s\t%s\t%s\t%s\t%s\n", 
                 $message->peeraddr, 
                 $message->peerport, 
                 $message->facility, 
                 $message->severity, 
                 $message->time, 
                 $message->hostname, 
                 $message->message
      }
  }

Forking Syslog Server

  use Net::Syslogd;

  my $syslogd = Net::Syslogd->new()
    or die "Error creating Syslogd listener: %s", Net::Syslogd->error;

  while (1) {
      my $message;
      if (!($message = $syslogd->get_message())) { next }

      my $pid = fork();

      if (!defined($pid)) {
          print "fork() Error!\n";
          exit
      } elsif ($pid == 0) {
          if (!(defined($message->process_message()))) {
              printf "$0: %s\n", Net::Syslogd->error
          } else {
              printf "%s\t%i\t%s\t%s\t%s\t%s\t%s\n", 
                     $message->peeraddr, 
                     $message->peerport, 
                     $message->facility, 
                     $message->severity, 
                     $message->time, 
                     $message->hostname, 
                     $message->message
          }
          exit
      } else {
          # parent
      }
  }

LICENSE

This software is released under the same terms as Perl itself. If you don't know what that means visit http://perl.com/.

AUTHOR

Copyright (C) Michael Vincent 2010

http://www.VinsWorld.com

All rights reserved