日志文件需要时不时地更新。这里的问题是,如果我使用多线程写入相同的日志文件,我可能会看到有些行不正确。
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 中使用多线程在日志文件中记录状态的解决方案。
提前致谢
最佳答案
您可以在写入之前锁定文件,并在写入之后释放锁定。
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 $!;
}
关于multithreading - 如何编写多线程perl脚本来写入日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23753538/