1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
###########################################################################
#
# Syslog.pm
#
# Copyright (C) 1999 Raphael Manfredi.
# Copyright (C) 2002-2017 Mark Rogaski, mrogaski@cpan.org;
# all rights reserved.
#
# See the README file included with the
# distribution for license information.
#
##########################################################################
use strict;
require Log::Agent::Channel;
########################################################################
package Log::Agent::Channel::Syslog;
use vars qw(@ISA);
@ISA = qw(Log::Agent::Channel);
use Sys::Syslog qw(:DEFAULT setlogsock);
#
# ->make -- defined
#
# Creation routine.
#
# Attributes (and switches that set them):
#
# prefix the logging prefix to use (application name, usally)
# facility the syslog facility name to use ("auth", "daemon", etc...)
# showpid whether to show pid
# socktype socket type ('unix' or 'inet')
# logopt list of openlog() options: 'ndelay', 'cons' or 'nowait'
#
sub make {
my $self = bless {}, shift;
my (%args) = @_;
my %set = (
-prefix => \$self->{'prefix'},
-facility => \$self->{'facility'},
-showpid => \$self->{'showpid'},
-socktype => \$self->{'socktype'},
-logopt => \$self->{'logopt'},
);
while (my ($arg, $val) = each %args) {
my $vset = $set{lc($arg)};
unless (ref $vset) {
require Carp;
Carp::croak("Unknown switch $arg");
}
$$vset = $val;
}
$self->{'logopt'} =~ s/\bpid\b//g; # Must use showpid => 1
$self->{'logopt'} .= ' pid' if $self->showpid;
return $self;
}
#
# Attribute access
#
sub prefix { $_[0]->{'prefix'} }
sub facility { $_[0]->{'facility'} || 'user' }
sub showpid { $_[0]->{'showpid'} }
sub socktype { $_[0]->{'socktype'} }
sub logopt { $_[0]->{'logopt'} }
sub connected { $_[0]->{'connected'} }
#
# ->connect
#
# Connect to syslogd.
#
sub connect {
my $self = shift;
setlogsock $self->socktype if $self->socktype;
openlog $self->prefix, $self->logopt, $self->facility;
$self->{'connected'}++;
}
#
# ->close -- defined
#
# Disconnect from syslogd.
#
sub disconnect {
my $self = shift;
return unless $self->connected;
closelog;
$self->{'connected'} = 0;
}
#
# ->write -- defined
#
sub write {
my $self = shift;
my ($priority, $logstring) = @_;
$self->connect unless $self->connected;
syslog $priority, "%s", $logstring;
}
1; # for require
__END__
=head1 NAME
Log::Agent::Channel::Syslog - syslog logging channel for Log::Agent::Logger
=head1 SYNOPSIS
require Log::Agent::Channel::Syslog;
my $channel = Log::Agent::Channel::Syslog->make(
# Specific attributes
-prefix => prefix,
-facility => "user",
-showpid => 1,
-socktype => { port => 514, type => "udp" },
-logopt => "ndelay",
);
=head1 DESCRIPTION
The syslog logging channels directs operations to syslog() via the
Sys::Syslog(3) interface.
The creation routine make() takes the following switches:
=over 4
=item C<-facility> => I<facility>
Tell syslog() which facility to use (e.g. "user", "auth", "daemon").
Unlike the Sys::Syslog(3) interface, the facility is set once and for all:
every message logged through this channel will use the same facility.
=item C<-logopt> => I<syslog options>
Specifies logging options, under the form of a string containing zero or
more of the words I<ndelay>, I<cons> or I<nowait>.
=item C<-prefix> => I<prefix>
The I<prefix> here is syslog's identification string.
=item C<-showpid> => I<flag>
Set to true to have the PID of the process logged. It is false by default.
=item C<-socktype> => I<options>
Configures the logging socket.
The given I<options> are passed without interpretation to C<setlogsock()>
hence refer to Sys::Sylog(3) for the exhaustive set of configuration
options there.
If you run C<rsyslogd> over TCP on a non-standard port 60514 for instance, you
could say:
=over 4
-socktype => { port => 60514, type => "tcp" }
=back
but there are many other configuration possibilities.
=back
=head1 AUTHOR
Raphael Manfredi F<E<lt>Raphael_Manfredi@pobox.comE<gt>>
=head1 SEE ALSO
Log::Agent::Logger(3), Sys::Syslog(3).
=cut
|