Why not adopt me?
NAME
SyslogScan::Daemon - Watch log files
SYNOPSIS
syslogscand [-f] [-c config] {start|stop|reload|restart|check}
@ISA = qw(SyslogScan::Daemon);
newdaemon()
DESCRIPTION
SyslogScan::Daemon is a framework on which to hang log file watchers. SyslogScan::Daemon is a subclass of Daemon::Generic and uses Plugins to create the framework.
CONFIGURATION PREFIX
The configuration prefix for plugins for SyslogScan::Daemon is ''. Use plugin
to load plugins.
CONFIGURATION PARAMETERS
SyslogScan::Daemon defines the following configuration parameters which may be given in indented lines that follow plugin SyslogScan::Daemon
or anywhere in the configuration file.
- debug
-
(default 0) Turn on debugging.
- configfile
-
(default
/etc/syslogscand.conf
). The location of the configuration file for the plugins or SyslogScan::Daemon.
WRITING PLUGINS
Plugins for SyslogScan::Daemon should subclass SyslogScan::Daemon::Plugin. The following methods will be invoked by SyslogScan::Daemon:
- new(%args)
-
Called from Plugins and
%args
will come from the configuration file. An object of the type of the plugin is expected as the return value. It's okay todie
here. - preconfig($configfile)
-
Called right after
new()
and when areload
is requested. Return value is a %hash that is then passed intopostconfig()
. It's okay todie
here. - postconfig(%args)
-
Called after all plugin's
preconfig()
s are called. No return value is expected. - get_logs()
-
Called after
postconfig()
. The return value ofget_logs()
is a hash: the keys are log file names and the values are lists of regular expressions to match. For example:sub get_logs { return ( '/var/log/mail.log' => [ qr{postfix/smtp\[\d+\]: \w+: to=<([^@]+@([^>]+))>, .*, status=(bounced).*\b(?i:blacklist(ed)?|spamming|spam list|removal|remove|block list|blocked for abuse)\b}, qr{postfix/smtp\[\d+\]: \w+: to=<([^@]+@([^>]+))>, .*, status=(deferred).*Rejected: \S+ listed at http}, ], ); }
The default implementation of
get_logs()
checks to see if there is a$self-
{plugins}> member and if there is, it re-dispatches theget_logs()
call to its plugins. It keeps track of the regular expressions returned by its plugins that inmatched_line()
, callbacks can be redistributed to the appropriate plugin:sub matched_line { my ($self, $logfile, $rx) = @_; for my $plugin (@{$self->{logs}{$logfile}{$rx}}) { my @ret = $plugin->invoke('parse_logs', $logfile, $rx); # your stuff here... } }
- matched_line($file, $rx)
-
Called after one of the regular expressions returned by
get_logs()
matched a log line. The arguments are the log filename where the match was found and the regular expression that matched. Passed implicitly are the line that was matched ($_
) and any of the numbered regular expression submatches ($1
,$2
, etc). No return value is expected. - periodic()
-
Called once per second or so (or however of the config file says).
The default implementation of
periodic()
checks to see if there is a$self-
{plugins}> member and if there is calls$self-
{plugins}->invoke('periodic')> to send the heartbeat down the plugin tree.
Use Plugins::SimpleConfig
Using Plugins::SimpleConfig to write the plugins make the job much easier.
Plugins that have plugins
For plugins that in turn have plugins, a helper function is provided in SyslogScan::Daemon::Plugin:
sub set_api
{
my ($self, $ssd_configfile, @api) = @_;
my $config = $self->{configfile} || $ssd_configfile;
$self->{myapi} = Plugins::API->new;
$self->{myapi}->api(@api);
$self->{myapi}->autoregister($self);
$self->{myapi}->register(undef, parentapi => sub { return $self->{api} });
$self->{plugins} = new Plugins context => $self->{context};
$self->{plugins}->readconfig($config, self => $self);
$self->{plugins}->api($self->{myapi});
$self->{myapi}->plugins($self->{plugins});
$self->{plugins}->initialize();
$self->{plugins}->invoke('preconfig', $config);
}
To use it, define your preconfig()
as follows:
sub preconfig
{
my ($self, $ssd_configfile, @api) = @_;
$self->set_api($ssd_configfile,
stuff for Plugins::API::api()
);
... more initialization if needed
}
SEE ALSO
Plugins Plugins::Style1 Plugins::API SyslogScan::Daemon::BlacklistDetector SyslogScan::Daemon::SpamDetector
LICENSE
Copyright (C) 2006, David Muir Sharnoff <muir@idiom.com> This module may be used and copied on the same basis as Perl itself.
If you find this useful, please thank me by giving me a chance to bid on your next Internet transit purchase of T1 or larger. I have good prices for T1s, T3s, OC3s and such. Thank you.