in reply to Sharing a filehandle with an asynchronous event

Hello stevieb,

I am not sure if you only want to use your module stevieb9/logging-simple or any logging module e.g. Log::Log4perl.

I put together a simple example using the default code from the documentation from Async::Event::Interval and your info that you want to log.

Sample of code bellow:

#!/usr/bin/perl use strict; use warnings; use Async::Event::Interval; use Log::Log4perl qw(:easy); Log::Log4perl->easy_init( { level => $INFO, file => 'test.log' } ); my $logger = Log::Log4perl->get_logger(); my $count = 1; my $event = Async::Event::Interval->new(1.5, \&callback); $event->start; for (1..10){ print "$_: in main loop\n"; $event->stop if $_ == 3; $event->start if $_ == 7; if ($event->status){ print "event is running\n"; $logger->info('logging in main'); } if ($event->status == -1){ print "event has crashed... restarting it\n"; $event->restart; } sleep 1; } sub callback { print "timed event callback\n"; $logger->info("running poll $count") ; $count++; } __END__ $ perl test.pl 1: in main loop event is running timed event callback timed event callback 2: in main loop event is running 3: in main loop timed event callback 4: in main loop 5: in main loop 6: in main loop 7: in main loop event is running timed event callback 8: in main loop event is running timed event callback 9: in main loop timed event callback event is running 10: in main loop timed event callback event is running timed event callback $ cat test.log 2018/01/23 17:34:15 logging in main 2018/01/23 17:34:15 running poll 1 2018/01/23 17:34:16 logging in main 2018/01/23 17:34:16 running poll 2 2018/01/23 17:34:22 logging in main 2018/01/23 17:34:22 running poll 1 2018/01/23 17:34:23 logging in main 2018/01/23 17:34:23 running poll 2 2018/01/23 17:34:24 running poll 3 2018/01/23 17:34:24 logging in main 2018/01/23 17:34:25 logging in main 2018/01/23 17:34:25 running poll 4

If this is not something that you are looking for, let me know if I understand not correctly and I will try to come up with something else.

Hope this helps, BR.

Seeking for Perl wisdom...on the process of learning...not there...yet!

Replies are listed 'Best First'.
Re^2: Sharing a filehandle with an asynchronous event
by stevieb (Canon) on Jan 23, 2018 at 23:12 UTC

    This is actually great! To be honest, I've never used Log::Log4perl before, so this got me to doing some testing and reading of the very informative docs. It does what is needed here so I do believe I am going to swap out for this logging distribution in this case. There's even config file directives to eliminate race-type conditions (ie. overlap).

    That said, I'm still wondering if there's a real, feasible way to "share" a file handle across procs (forks, really). I don't believe there is, but I'm still open to hear input. Even at a C level, it doesn't appear very trivial to get things to run smoothly all of the time where eliminating overlap can be made consistent.

    Update

    "I put together a simple example using the default code from the documentation from Async::Event::Interval and your info that you want to log."

    That's awesome that you actually tested out the SYNOPSIS of the distribution :)

      I'm still wondering if there's a real, feasible way to "share" a file handle across procs (forks, really)

      It depends on the system you are running on. Under Linux one can share file descriptor even between processes (forks). One can open file in append mode, use buffering based on EOL character and then the system will make sure that messages from different processes are written line-by-line. That will put lines from one process between lines from another process, but won't corrupt lines.

      Of course file handle is not file descriptor, so passing of "file handles" around is a little bit more work, but still is quite possible.

      With multi-threaded processes things are similar. Even though there are internal mutexes (though I'm not sure here about perl), still one has to make sure that buffering is line-oriented and file descriptor is in append mode.

      Hello stevieb,

      I am glad that it worked for you my proposed solution. To be honest when ever I need to do some logging I use this module. It is so powerful and flexible to do many many things.

      Regarding: That said, I'm still wondering if there's a real, feasible way to "share" a file handle across procs (forks, really). I was reading yesterday the module AnyEvent that maybe can do what you are asking for. Unfortunately I did not spend time to experiment with it but maybe you can give it a try.

      Never the less if you manage to resolve your problem update us also so we can have a reference for a possible similar case in future :)

      BR / Thanos

      Seeking for Perl wisdom...on the process of learning...not there...yet!