#!/usr/bin/perl -w # Got from http://poe.perl.org/?POE_Cookbook/Watching_Logs use POE qw/Wheel::FollowTail/; use strict; $| = 1; my $filename = $ARGV[0]; my $filesize_after = -s "$filename"; die "Usage: $0 \n" unless $filename; die "$0: $filename: No such file or directory\n" unless -e $filename; die "$0: $filename: Permission denied\n" unless -r $filename; POE::Session->create ( inline_states => { _start => sub { $_[HEAP]->{wheel} = POE::Wheel::FollowTail->new( Filename => $_[ARG0], InputEvent => 'got_line', ErrorEvent => 'got_error', PollInterval => 1, ); $_[HEAP]->{first} = 0; }, got_line => sub { print "$_[ARG0]\n" if $_[HEAP]->{first}++ }, got_error => \&handle_log_error, }, args => [$filename], ); # Handle log errors to shut down the service. sub handle_log_error { my ($heap, $operation, $errno, $error_string, $wheel_id) = @_[HEAP, ARG0, ARG1, ARG2, ARG3]; my $service = $heap->{services}->{$wheel_id}; print "--- $service log $operation error $errno: $error_string\n"; print "--- Shutting down $service log watcher.\n"; delete $heap->{services}->{$wheel_id}; delete $heap->{watchers}->{$wheel_id}; } sub print_tail { my ($heap, $line) = @_[HEAP, ARG0]; my $filesize = -s "$heap->{wheel}->[1]"; if ( $filesize >= $filesize_after) { print "$line\n" if $_[HEAP]->{first}++; } else { handle_file_error(); } $filesize_after = -s "$heap->{wheel}->[1]"; } $poe_kernel->run();