Hi all,
i've started to use POE for logging event on various sistems. Now, i'm facing the problem to track a log file, being written by a power inverter control software, on a Windows machine The control sofware create the log file as soon as the inverter starts to perform operations (we're talking about a PV control system). Considering that i've used the "Filename" watch which documentation says: Specify the|Filename|to watch. POE::Wheel::FollowTail will wait for the file to appear if it doesn't exist.

The issue happens as soon as file appears, it seems that the application goes in an infinite loop calling log_got_line. The only way is to stop the application.

Am i missing something?
Thanks in advance for any hints.

Alberto De Boni


Here the application.

use warnings;
use strict;

# Include POE and POE::Component::Server::TCP.

use POE qw(Component::Server::TCP);
use POE qw/Wheel::FollowTail/;

use constant port => 10240;

my $currentPower;
my $totalProduction;

my @timeData = localtime(time);


my $year = 1900+$timeData[5];
my $month = 1+$timeData[4];
my $day = $timeData[3];

my $log_file = "C:\\inverter\\".$year."-".$month."-".$day.".log";

print "START LOG OPERATION\n\n";
print "Logging $log_file\n";

# Start a TCP server.  Client input will be logged to the console and
# echoed back to the client, one line at a time.

POE::Component::Server::TCP->new(
  Alias       => "PVMonitor",
  Port        => port,
  ClientInput => sub {
    my ($session, $heap, $input) = @_[SESSION, HEAP, ARG0];
    print "Session ", $session->ID(), " got input: $input\n";
    if ($input eq "DATA"){
    my $answer = $currentPower.";".$totalProduction;
    $heap->{client}->put($answer);
    }
  }
);


POE::Session->create
(
    inline_states =>{
      _start => sub {
        $_[HEAP]->{wheel} = POE::Wheel::FollowTail->new(
                Filename   => $log_file,
                InputEvent => 'got_line',
                ErrorEvent => 'got_error',
                #SeekBack   => 2048,
                ResetEvent => 'log_reset',

              );
            $_[HEAP]->{first} = 0;
        },
    got_line => \&log_got_line,,
        got_error => sub { warn "$_[ARG0]\n" },
        log_reset => \&got_log_reset,
    },
        args=> $log_file,
  );


sub got_log_reset{
   my ($heap, $wheel_id) = @_[HEAP, ARG0];
   my $service = $heap->{services}->{$wheel_id};
}
# Start the server.
sub log_got_line{
  if ($_[HEAP]->{first}++){
    my @splitted = split (';', $_[ARG0]);
    #print "$_[ARG0]\n" ;
    print "$splitted[0]\n";
    $currentPower=$splitted[12];
    $totalProduction=$splitted[15];
  }
}
$poe_kernel->run();
exit 0;

Reply via email to