in reply to Real time log parser

What's wrong with File::Tail?  Is it not "real-time" enough?

It doesn't poll the file for updates every microsecond, but you can configure it's behavior to a certain degree (in particular with maxinterval and interval).

Replies are listed 'Best First'.
Re^2: Real time log parser
by kazak (Beadle) on Jan 02, 2012 at 18:36 UTC
    I understand that, but: "How to pass found string as an argument for a subroutine or external script?", this is the thing which I'm not fully understand, because hold-subroutine works if I'm passing found string as an argument from a command line, but not works with script I attached above, perhaps I messed up somewhere.

      There's no difference to the usual way passing arguments to subroutines or scripts works.  In the above code, $_ (the current line read fron the file handle) is being passed to a subroutine hold() in case the regex matches. What the routine then does with it, depends on its implementation... So what does it look like?  Could it be you're confusing subroutine arguments (@_) and command line arguments (@ARGV)?

        Here's what I'm trying to do in general. As I said before, I'm new to perl so my code be so-so, but it worked from the command line, and now I'm trying to make it work with File::Tail:
        #!/usr/bin/perl # Squid reconfiguration script rev: 0.87 # use File::Tail; my (@tmpl,@cut); sub ban { open( CFG, "<", "/etc/squid/squid.conf" ); while ( <CFG> ) { push @cfg, $_; } close(CFG); my @cutoff = grep /proxy_/,@_; s/ROUNDROBIN_PARENT\///g for @cutoff; @cutoff = grep /@cutoff/,@cfg; open( GREY, ">", "/etc/squid/all.grey" ); if (@cutoff) { print GREY @cutoff; print GREY "10\n"; } close (GREY); print "Banned parrent: @cutoff\n"; print " Strings with parrent in conf: @cutoff\n"; open( EXC, ">", "/etc/squid/squid.conf" ); my %dels = map { $_ => 1 } @cutoff; @cfg = grep !$dels{$_}, @cfg; print EXC @cfg; close (EXC); @args = ("/etc/init.d/squid", "reload"); system(@args) == 0 or die "system @args failed: $?" ; } my $name = "/var/log/squid/access.log"; my $ref=tie *FH,"File::Tail",(name=>$name); while (<FH>) { my $res = ban ($_); m/\/sorry\// && ban ($_); }