如何编写多线程perl脚本来编写日志文件?

时间:2014-05-20 07:31:07

标签: multithreading perl

日志文件需要时不时更新。这里的问题是如果我使用多线程写一个相同的日志文件,我可以看到一些行是不正确的。

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中的多线程在日志文件中记录状态的解决方案。

提前致谢

1 个答案:

答案 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 $!;
}