The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#================================ Syslog.pm ==================================
# Filename:             Syslog.pm
# Description:          Syslog logger delegate.
# Original Author:      Dale M. Amon
# Revised by:           $Author: amon $ 
# Date:                 $Date: 2008-08-28 23:20:19 $ 
# Version:              $Revision: 1.9 $
# License:		LGPL 2.1, Perl Artistic or BSD
#
#=============================================================================
use strict;
use Sys::Syslog;
use Fault::Delegate;
use Fault::ErrorHandler;
use Fault::Msg;

package Fault::Delegate::Syslog;
use vars qw{@ISA};
@ISA = qw( Fault::Delegate );

#=============================================================================
#                      Family internal methods
#=============================================================================

sub _write ($$) {
    my ($self, $msg) = @_;
    my $m            = $msg->unstamped_log_line;

    if (!Sys::Syslog::syslog ($msg->priority, $m)) {
	($self->warn ("Failed log write: \'$m\' to syslog!")); return 0;}
    return 1;
}

#-----------------------------------------------------------------------------

sub _connect ($) {
    my $self = shift;
    if (!$self->{'init'}) {
	if (!Sys::Syslog::openlog ("", 'cons,ndelay,pid,perror,user','user')) {
	    return 0;
	}
	my $msg = Fault::Msg->new ("Initialized syslog",'INFO','notice');
	$self->{'init'} = 1 if ($self->_write ($msg));
    }
    return 1;
}

#=============================================================================
#		      Logger Delegate Protocol
#=============================================================================
# Utilizes Fault::Delegate parent methods with subclass overrides seen above.

#=============================================================================
#                       Pod Documentation
#=============================================================================
# You may extract and format the documentation section with the 'perldoc' cmd.

=head1 NAME

 Fault::Delegate::Syslog - Syslog delegate.

=head1 SYNOPSIS

 use Fault::Delegate::Syslog;
 $self = Fault::Delegate::Syslog->new;
 $okay = $self->log ($msg);

=head1 Inheritance

 UNIVERSAL
   Fault::Delegate
     Fault::Delegate::Syslog

=head1 Description

This is a delegate that writes log messages to the syslog. Syslogging must be
accessible to the calling program. 

Fault::Delegate::Syslog satisfies the minimum requirements of the
Fault::Delegate logger delegate protocol.

=head1 Examples

 use Fault::Delegate::Syslog;
 use Fault::Msg;
 use Fault::Logger;

 my $msg       = Fault::Msg                   ("Arf!");
 my $baz       = Fault::Delegate::Syslog->new;
 my $waslogged = $baz->log                    ($msg);

                 Fault::Logger->new           ($baz);
 my $waslogged = Fault::Logger->log           ("Bow! Wow!");

 [See Fault::Logger for a detailed example.]

=head1 Instance Variables

 init     True if a syslog connection was succesfully initialized.

=head1 Class Methods

=over 4

=item B<$delegate = Fault::Delegate::Syslog-E<gt>new>

Create a logger delegate object that writes log messages to syslog.
A warning is issued if the program cannot initialize and write a startup
message to syslog.

Returns undef if it fails to set up the syslog connection.

=back 4

=head1 Logger Protocol Instance Methods

=over 4

=item B<$didlog = $self-E<gt>log ($msgobj)>

Send the information contained in $msgobj to syslog at the $priority contained
by it and return true if we succeeded in doing so. The message is formatted 
so that it will appear in the log like this:

 Apr 17 18:00:36 localhost UnspecifiedProcess[12638]: NOTE(notice): Testing syslogger again

=back 4

=head1 Private Class Methods

 None.

=head1 Private Instance Methods

=over 4

=item B<$bool = $self-E<gt>_write ($msg)>

=item B<$bool = $self-E<gt>_connect>

Impliments the above overrides to the internal family protocol utilized by 
the Fault:Delegate log and test methods.

=back 4

=head1 Errors and Warnings

Local warning messages are issued if the sys logger cannot be reached or has 
any problems whatever. 

=head1 KNOWN BUGS

 See TODO.

=head1 SEE ALSO

Fault::Logger, Fault::Delegate, Fault::Msg, Sys::Syslog
Fault::ErrorHandler

=head1 AUTHOR

Dale Amon <amon@vnl.com>

=cut

#=============================================================================
#                                CVS HISTORY
#=============================================================================
# $Log: Syslog.pm,v $
# Revision 1.9  2008-08-28 23:20:19  amon
# perldoc section regularization.
#
# Revision 1.8  2008-08-17 21:56:37  amon
# Make all titles fit CPAN standard.
#
# Revision 1.7  2008-07-24 21:17:24  amon
# Moved all todo notes to elsewhere; made Stderr the default delegate instead of Stdout.
#
# Revision 1.6  2008-05-09 18:24:55  amon
# Bugs and changes due to pre-release testing
#
# Revision 1.5  2008-05-07 18:14:55  amon
# Simplification and standardization. Much more is inherited from Fault::Delegate.
#
# Revision 1.4  2008-05-05 19:25:49  amon
# Catch any small changes before implimenting major changes
#
# Revision 1.3  2008-05-04 14:42:02  amon
# Updates to perl doc; dropped subclass new method..
#
# Revision 1.2  2008-05-03 00:56:57  amon
# Changed standard argument ordering.
#
# Revision 1.1.1.1  2008-05-02 16:36:01  amon
# Fault and Log System. Pared off of DMA base lib.
#
# Revision 1.6  2008-04-18 11:34:39  amon
# Wrote logger delegate abstract superclass to simplify the code in all the 
# delegate classes.
#
# Revision 1.5  2008-04-11 22:25:23  amon
# Add blank line after cut.
#
# Revision 1.4  2008-04-11 18:56:35  amon
# Fixed quoting problem with formfeeds.
#
# Revision 1.3  2008-04-11 18:39:15  amon
# Implimented new standard for headers and trailers.
#
# Revision 1.2  2008-04-10 15:01:08  amon
# Added license to headers, removed claim that the documentation section still
# relates to the old doc file.
#
# 20041203      Dale Amon <amon@vnl.com>
#               Modified old Document::LogFile code into
#		a very simple delegate that prints to syslog.
#
1;