summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/PerlDaemon/Logger.pm45
-rw-r--r--lib/PerlDaemon/RunModules.pm5
-rw-r--r--lib/PerlDaemon/ThreadedLogger.pm45
-rw-r--r--lib/PerlDaemonModules/ExampleModule2.pm2
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;