下午好,
我有一个小的 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
}
当我有一个测试服务器时,一切似乎都运行良好。在生产中,server.log 文件会轮换。当日志被轮换时,脚本会保留原始文件,而不是替换它的文件。
IE。 server.log 正在被监控,server.log 被移动并压缩到 logs/date_x.log.gz,server.log 现在是一个新文件。
如何调整我的脚本以监视文件名“server.log”,而不是当前称为“server.log”的文件?
最佳答案
您是否考虑过只使用 tail -F
作为脚本的输入:
tail -F server.log 2>/dev/null | perl -nE 'say if /match/'
这将监视命名文件,将每一行传递给 STDIN 上的脚本。它只会正确跟踪 server.log,如下所示:
echo 'match' >server.log
(按脚本匹配)
mv server.log server.log.old
echo 'match' >server.log
(也匹配)
您可以打开
tail -F
作为 Perl 中的文件,使用:open(my $fh, '-|', 'tail -F server.log 2>/dev/null') or die "$!\n";
关于perl - 跨轮换监视 Perl 中的文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836307/