日志文件需要时不时更新。这里的问题是如果我使用多线程写一个相同的日志文件,我可以看到一些行是不正确的。
my $date_string = strftime "%Y%m%d\_%H\_%M\_%S",localtime;
open(LOG,"+>","log\_$date_string.log")or die "cant open the file";
for ($count = 1; $count <=$thread_count ; $count++)
{
my $thread = threads->new(\&process);
push(@threads,$thread);
}
foreach (@threads)
{
$_->join;
}
close LOG;
sub process
{ ......
......
print LOG "$datestring"."\|$process_id\|$host\|$port\|input\|Processing $filename\|\n";
}
对于上面的代码我得到这样的输出:
2014-05-20 12:12:46|19903|172.16.7.109|2000|input|Processing /opt/search_command/_13668.out|
2014-05-20 12:12:47|19903|172.16.7.109|2000|search|Processing /opt/search_command/_13668.out|0.940|
5-20 12:12:46|19903|172.16.7.109|2000|input|Processing /opt/search_command/_11061.out|
2014-05-20 12:12:47|19903|172.16.7.109|2000|search|Processing /opt/search_command/_11061.out|0.952|
如果您看到第三行日期打印不正确
我需要一个关于如何使用perl中的多线程在日志文件中记录状态的解决方案。
提前致谢
答案 0 :(得分:3)
您可以在写入之前锁定文件,然后释放锁定。
sub process {
lock(\*LOG);
print LOG ..
unlock(\*LOG);
}
use Fcntl qw(:flock SEEK_END);
sub lock {
my ($fh) = @_;
flock($fh, LOCK_EX) or die $!;
seek($fh, 0, SEEK_END) or die $!;
}
sub unlock {
my ($fh) = @_;
flock($fh, LOCK_UN) or die $!;
}