我正在使用下面的代码连续读取文件。我遇到的问题是,每当我运行代码时,它都会从文件开头开始,返回整个文件,而不是从最后 50 行开始。
我查阅了文档并尝试了 tail=>n 参数的不同值 - 甚至 n= 文件中的总行数减去 50 - 但是我的代码每次都从文件的开头开始,而不是像我一样在结尾处开始需要。我究竟做错了什么?
use strict;
use warnings;
use File::Tail;
my $name; #file name
my $name="/home/richard/double-take/messages.log";
my $line;
my $file=File::Tail->new(name=>$name, interval=>3, maxinterval=>3, tail=>50);
while (defined($line=$file->read)) {
print "$line";
}
File::Tail的作者在这里。
File::Tail
当它正在读取的文件有一段时间没有更新时,它会尝试变得聪明,它会以越来越长的间隔(可使用maxinterval配置)检查它,因为对未写入的文件进行忙等待是没有意义的到。在等待adjustmentafter * maxinterval后,File::Tail 判断文件可能已从其下方旋转出来。(您也可以使用参数Resetafter更改此设置)。File::Tail 用户读取的许多日志文件都配置为以一种或另一种方式轮换。有些通过关闭文件、重命名文件,然后使用原始名称写入新文件来进行轮换。为了解决这个问题,在设置的时间间隔之后,File::Tail 尝试重新打开文件。
问题是,当它重新打开文件时,应该从哪里读取它?大多数常见用例在重新打开文件时需要与第一次打开文件时进行不同的处理。因此 File::Tail 有一个特殊的参数来决定重新打开后如何处理文件,它称为reset_tail。
默认情况下,它设置为 -1(给我整个文件),因为这是最常见的用例,即“我正在阅读和分析该文件,因此在发生旋转后,我想查看我所选择的所有行”我在查看旧文件时错过了”。但如果你不想在重新打开后看到整个文件,只需将reset_tail设置为0,或者一个正整数。
我无法对 ikegami 提出的修复发表评论,自从我编写该代码以来已经很多年了,我需要对其进行审查并重新理解它,然后才能自信地说它适合其余的代码。
我将尝试发布一个新版本,其中包含更多文档修复,警告您可以调整的不同参数,并且可能会添加“ignore-same-inode”参数,以便当使用 File::Tail 的工程师有信心时有问题的文件将被轮换,而不是简单地被覆盖。