Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Monitoring file contents in Perl across rotations

Tags:

file

perl

Good afternoon,

I have a small Perl script that essentially emulated the tail -f functionality on a Minecraft server.log. The script checks for certain strings and acts in various ways.

A simplified version of the script is below:

#!/usr/bin/perl

use 5.010;
use warnings;
use strict;

my $log = "PATH TO LOG";
my $curpos;

open(my $LOGFILE, $log) or die "Cannot open log file";

# SEEK TO EOF
seek($LOGFILE, 0, 2);

for (;;){
        my $line = undef;

        seek($LOGFILE,0,1);  ### clear OF condition
        for($curpos = tell($LOGFILE); <$LOGFILE>; $curpos = tell($LOGFILE)){
                $line = "$_ \n";


                if($line =~ /test string/i){
                        say "Found test string!";
                }
        }

        sleep 1;
        seek($LOGFILE,$curpos,0); ### Setting cursor at the EOF
}

When I had a test server up everything seemed to work fine. In production, the server.log file gets rotated. When a log gets rotated, the script keeps hold of original file, and not the file that replaces it. I.e. server.log is being monitored, server.log gets moved and compressed to logs/date_x.log.gz, server.log is now a new file.

How can I adapt my script to monitor the filename "server.log", rather than the file that is currently called "server.log"?

like image 938
forquare Avatar asked Oct 18 '25 17:10

forquare


1 Answers

Have you considered just using tail -F as the input to your script:

tail -F server.log 2>/dev/null | perl -nE 'say if /match/'

This will watch the named file, passing each line to your script on STDIN. It will correctly track only server.log, as shown below:

echo 'match' >server.log

(matched by script)

mv server.log server.log.old
echo 'match' >server.log

(also matched)

You can open the tail -F as a file in Perl using:

open(my $fh, '-|', 'tail -F server.log 2>/dev/null') or die "$!\n";
like image 184
Matthew Franglen Avatar answered Oct 20 '25 15:10

Matthew Franglen