跨旋转监视Perl中的文件内容

for*_*are 3 perl file

下午好,

我有一个小的Perl脚本,基本上模拟tail -f了Minecraft server.log上的功能.该脚本检查某些字符串并以各种方式执行操作.

该脚本的简化版本如下:

#!/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
}
Run Code Online (Sandbox Code Playgroud)

当我有一个测试服务器时,一切似乎工作正常.在生产中,server.log文件被轮换.当日志轮换时,脚本会保留原始文件,而不是替换它的文件.即,正在监视server.log,将server.log移动并压缩为logs/date_x.log.gz,server.log现在是一个新文件.

如何调整我的脚本来监视文件名"server.log",而不是当前名为"server.log"的文件?

Mat*_*len 5

您是否考虑过仅用tail -F作脚本的输入:

tail -F server.log 2>/dev/null | perl -nE 'say if /match/'
Run Code Online (Sandbox Code Playgroud)

这将观察命名文件,将每一行传递给STDIN上的脚本.它将只正确跟踪server.log,如下所示:

echo 'match' >server.log
Run Code Online (Sandbox Code Playgroud)

(由脚本匹配)

mv server.log server.log.old
echo 'match' >server.log
Run Code Online (Sandbox Code Playgroud)

(也匹配)

您可以tail -F使用以下命令在Perl中打开文件:

open(my $fh, '-|', 'tail -F server.log 2>/dev/null') or die "$!\n";
Run Code Online (Sandbox Code Playgroud)