Perl File :: Tail带有符号链接

时间:2015-11-12 14:33:00

标签: perl tail

背景

我使用File::Tail来拖尾日志文件符号链接。符号链接在午夜后更新以包含新的日期戳,遗憾的是,在更新符号链接后,我的脚本不会拖尾新文件。否则,我的脚本按预期工作。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use Data::Dumper;
use charnames':full';
use Cwd 'abs_path';
use File::Tail;

my $symlink = sub {
my($log) = '/home/user/log'; 
};

my $file=File::Tail->new(
        name=>&$symlink,
        ignore_nonexistant=>1,
        tail=>0,
        interval=>0,
        maxinterval=>1,
        name_changes=>\&$symlink
        ) || warn $!;
print Dumper $file;

while (defined($_=$file->read)) {
# do a bunch of stuff;
}

问题

如何让perl遵循更新的符号链接?

2 个答案:

答案 0 :(得分:0)

从File :: Tail documentation

  

name_changes

     

某些日志记录系统会更改要写入的文件的名称,有时会包含日期,有时还会包含序列号,   有时其他更奇怪的变化。

     

File :: Tail将调用name_changes中定义的代码引用,而不是尝试实现各种聪明的检测方法。该   代码引用应该返回字符串,这是新的名称   文件尝试打开。

     

请注意,如果文件不存在,File :: Tail将报告致命错误(除非还指定了ignore_nonexistant)。

因此,您的代码引用应返回 new 文件的名称,根据您的问题,该文件中包含日期字符串。也许这样的事情会起作用:

use Path::Tiny;  # file system agnostic path utilty
use Time::Piece; # data utilties

my $symlink = sub {
   my $time = localtime; # a Time::Piece object
   return path(
      '/home/user/log',
      join('', $time->year, $time->mon, $time->mday), 
   )->canonpath;
};

今天这个子将返回:/home/user/log20151112

答案 1 :(得分:0)

我错过了来自

的回复
my $symlink = sub {
my($log) = '/home/user/log'; 
return $log;
};

现在完美运作!