package POEDaemon::Log; use strict; use warnings FATAL => 'all'; no warnings 'redefine'; #use POE qw(Component::Logger); use POE; use POEDaemon; my $logfiles = [ '/root/log/poedaemon.log', ]; sub states { return $_[0], [qw( log_start log_stop log_destroy logger )]; } sub log_start { my $heap = $_[HEAP]; #log_enabled && logline 'POE::Component::Logger->spawn'; # # #POE::Component::Logger->spawn #( # Alias => 'log', # ConfigFile => 'log.conf', #); my $dev_null = '/dev/null'; foreach my $file (@$logfiles) { my ($fh_dev_null, $fh); unless (open $fh_dev_null, $dev_null) { log_enabled && logline "cannot open file '%s': '%s'", $dev_null, $!; next; } unless (open $fh, '>>', $file) { log_enabled && logline "cannot open file '%s': '%s'", $file, $!; next; } my $wheel = POE::Wheel::ReadWrite->new ( InputHandle => $fh_dev_null, OutputHandle => $fh, Filter => POE::Filter::Line->new ( InputLiteral => "\n", OutputLiteral => "\n", ), ); my $wheel_id = $wheel->ID; $heap->{log}->{$wheel_id} = { wheel_id => $wheel_id, wheel => $wheel, file => $file, }; log_enabled && logline "created wheel #%s for log '%s'", $wheel_id, $file; } } sub log_stop { my $heap = $_[HEAP]; foreach my $wheel_id (keys %{$heap->{log} || {}}) { my $wheel = $heap->{log}->{$wheel_id}->{wheel}; return unless $wheel; my $out_octets = $wheel->get_driver_out_octets; if ($out_octets) { log_enabled && logline "found '%s' bytes in wheel #%s buffer, set wheel->event(FlushedEvent => 'log_destroy')", $out_octets, $wheel_id; $wheel->event(FlushedEvent => 'log_destroy'); } else { log_enabled && logline "destroy wheel #%s", $wheel_id; delete $heap->{log}->{$wheel_id}; } } } sub log_destroy { my ($heap, $wheel_id) = @_[HEAP, ARG0]; log_enabled && logline "destroy wheel #%s", $wheel_id; delete $heap->{log}->{$wheel_id}; } sub logger { my ($kernel, $heap, $format, $args) = @_[KERNEL, HEAP, ARG0, ARG1]; my $line; if (ref $args eq 'ARRAY') { $line = sprintf $format, @$args; } else { $line = $format; } #log_enabled && logline "got '%s'", $line; foreach my $wheel_id (keys %{$heap->{log} || {}}) { my $wheel = $heap->{log}->{$wheel_id}->{wheel}; return unless $wheel; $wheel->put($line); } #$kernel->post(log => log => $line); } 1;