背景
我使用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遵循更新的符号链接?
答案 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;
};
现在完美运作!