perl File :: Tail在一段时间后不读取文件中的行

时间:2015-04-01 04:58:59

标签: perl

我遇到问题,理解为什么File :: Tail FAILS从一个总是在更新的文件中读取1000行事务和自动翻转的行。

它在某种程度上正确读取,但后来慢下来,并且很长一段时间甚至无法读取日志中的行。我可以确认实际日志正在填充,因为file :: tail没有显示任何内容。

my $file = File::Tail->new(name=>"$name",
                           tail => 1000,
                           maxinterval=>1,
                           interval=>1,
                           adjustafter=>5,resetafter=>1, 
                           ignore_nonexistant=>1,
                           maxbuf=>32768);

while (defined(my $line=$file->read)) {
    #my $line=$file->read;
    my $xml_string  = "";

    #### Read only one event per line and deal with the XML.
    #### If the log entry is not a SLIM log, I will ignore it.
    if ($line =~ /(\<slim\-log\>.*\<\/slim\-log\>)/) {
        do_something
    } else {
        not_working for some reason
    }

有人可以帮我理解这一点。知道这个日志文件的更新速度接近每秒10MB或每秒1000个事件的近似值。

我应该将文件句柄或File :: Tail结果以其他更有效的方式处理吗?

1 个答案:

答案 0 :(得分:0)

似乎File :: Tail中存在限制。围绕http://www.perlmonks.org/?node_id=387706中讨论的其他更直接的选项(管道,分支,线程,在perl中寻找文件的末尾)提出了一些建议。

我最喜欢的选择是从管道中阻止读取:

open(TAIL, "tail -F $name|") or die "TAIL : $!";
while (<TAIL>) {
        test_and_do_something
}