diff options
| author | Paul Buetow <paul@buetow.org> | 2011-06-18 07:51:28 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2011-06-18 07:51:28 +0000 |
| commit | be756d0fcd03d03a43d2d873391d6cf3e46c6662 (patch) | |
| tree | d542490e458eb8c9035601cd0c6d7cfa15bd678b | |
| parent | c6e74a51a43bc5f9ac4bf7ad6a3fc7ea36a7961d (diff) | |
Using a thread safe message queue for logging, preparing for multi threading jobs
| -rw-r--r-- | lib/PerlDaemon/Logger.pm | 45 | ||||
| -rw-r--r-- | lib/PerlDaemon/RunModules.pm | 5 | ||||
| -rw-r--r-- | lib/PerlDaemon/ThreadedLogger.pm | 45 | ||||
| -rw-r--r-- | lib/PerlDaemonModules/ExampleModule2.pm | 2 |
4 files changed, 88 insertions, 9 deletions
diff --git a/lib/PerlDaemon/Logger.pm b/lib/PerlDaemon/Logger.pm index 8651980..7cdafc6 100644 --- a/lib/PerlDaemon/Logger.pm +++ b/lib/PerlDaemon/Logger.pm @@ -2,28 +2,61 @@ package PerlDaemon::Logger; use strict; use warnings; +use threads; +use threads::shared; use Shell qw(mv); use POSIX qw(strftime); $| = 1; +our $SELF; + +$SIG{'USR2'} = sub { + $SELF->flushlogs(); +}; + sub new ($$) { my ($class, $conf) = @_; - return bless { conf => $conf }, $class; + + die "Instance already exists" if defined $SELF; + $SELF = bless { conf => $conf }, $class; + + $SELF->{queue} = []; + share $SELF->{queue}; + + return $SELF; } sub logmsg ($$) { my ($self, $msg) = @_; my $conf = $self->{conf}; - my $logfile = $conf->{'daemon.logfile'}; my $logline = localtime()." (PID $$): $msg\n"; - open my $fh, ">>$logfile" or die "Can't write logfile $logfile: $!\n"; - print $fh $logline; - close $fh; - print $logline if $conf->{'daemon.daemonize'} ne 'yes'; + { lock $self->{queue}; + push @{$self->{queue}}, $logline; + } + + $self->flushlogs(); + + return undef; +} + +sub flushlogs ($$) { + my ($self, $msg) = @_; + my $conf = $self->{conf}; + my $logfile = $conf->{'daemon.logfile'}; + + { lock $self->{queue}; + open my $fh, ">>$logfile" or die "Can't write logfile $logfile: $!\n"; + for my $logline (@{$self->{queue}}) { + print $fh $logline; + print $logline if $conf->{'daemon.daemonize'} ne 'yes'; + } + close $fh; + @{$self->{queue}} = (); + } return undef; } diff --git a/lib/PerlDaemon/RunModules.pm b/lib/PerlDaemon/RunModules.pm index 5aa9f9a..6065c6a 100644 --- a/lib/PerlDaemon/RunModules.pm +++ b/lib/PerlDaemon/RunModules.pm @@ -4,6 +4,7 @@ package PerlDaemon::RunModules; use strict; use warnings; +use threads qw(exit stringify); use Time::HiRes qw(gettimeofday tv_interval); sub new ($$) { @@ -18,6 +19,7 @@ sub new ($$) { if (-d $modulesdir) { $logger->logmsg("Loading modules from $modulesdir"); + for my $module (<$modulesdir/*.pm>) { $logger->logmsg("Loading $module"); eval "require '$module'"; @@ -54,8 +56,7 @@ sub new ($$) { sub do ($) { my $self = shift; - my $conf = $self->{conf}; - my $logger = $conf->{logger}; + my $conf = $self->{conf}; my $logger = $conf->{logger}; my $modules = $conf->{modules}; my $scheduler = $conf->{scheduler}; diff --git a/lib/PerlDaemon/ThreadedLogger.pm b/lib/PerlDaemon/ThreadedLogger.pm new file mode 100644 index 0000000..a5a7776 --- /dev/null +++ b/lib/PerlDaemon/ThreadedLogger.pm @@ -0,0 +1,45 @@ +package PerlDaemon::ThreadedLogger; + +use strict; +use warnings; + +$| = 1; + +sub new ($$) { + my ($class, $conf) = @_; + my $self = $SELF = bless { conf => $conf }, $class; + + return $self; +} + +sub _pushmsg ($$) { + my ($self, $msg) = @_; + my $conf = $self->{conf}; + my $msgqueue = $conf->{msgqueue}; + + push @$msgqueue, $msg; +} + +sub logmsg ($$) { + my ($self, $msg) = @_; + + my $logline = localtime()." (PID $$): $msg\n"; + $self->_pushmsg($logline); + + return undef; +} + +sub err ($$) { + my ($self, $msg) = @_; + $self->logmsg($msg); + die "$msg\n"; +} + +sub warn ($$) { + my ($self, $msg) = @_; + $self->logmsg("WARNING: $msg"); + + return undef; +} + +1; diff --git a/lib/PerlDaemonModules/ExampleModule2.pm b/lib/PerlDaemonModules/ExampleModule2.pm index 948f24a..74fdd05 100644 --- a/lib/PerlDaemonModules/ExampleModule2.pm +++ b/lib/PerlDaemonModules/ExampleModule2.pm @@ -1,6 +1,6 @@ # PerlDaemon (c) 2010, 2011, Dipl.-Inform. (FH) Paul Buetow (http://perldaemon.buetow.org) -package PerlDaemonModules::ExampleModule; +package PerlDaemonModules::ExampleModule2; use strict; use warnings; |
