如何在Perl中读取持续更新的日志文件?

时间:2010-05-14 05:49:50

标签: perl

我有一个应用程序每5秒生成一次日志。日志格式如下。

11:13:49.250,interface,0,RX,0
11:13:49.250,interface,0,TX,0
11:13:49.250,interface,1,close,0
11:13:49.250,interface,4,error,593
11:13:49.250,interface,4,idle,2994215
and so on for other interfaces...

我正在努力将这些转换为以下CSV格式:

Time,interface.RX,interface.TX,interface.close....
11:13:49,0,0,0,....

目前很简单,但问题是,我必须在线获取CSV格式的数据,即一旦更新日志文件,CSV也应该更新。

我试图读取输出并使标题为:

#!/usr/bin/perl -w
use strict;

use File::Tail;
my $head=["Time"];
my $pos={};
my $last_pos=0;
my $current_event=[];

my $events=[];

my $file = shift;
$file = File::Tail->new($file);

while(defined($_=$file->read)) {
     next if $_ =~ some filters;

     my ($time,$interface,$count,$eve,$value) = split /[,\n]/, $_;
     my $key = $interface.".".$eve;

     if (not defined $pos->{$eve_key}) {
          $last_pos+=1;
          $pos->{$eve_key}=$last_pos;
          push @$head,$eve;
        }
        print join(",", @$head) . "\n";
}

使用Perl有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

模块Text::CSV将允许您读取和写入CSV格式文件。如果Text::CSV已安装,Text::CSV_XS会在内部使用Text::CSV_PP,或者它会回归使用File::Tail(感谢Brad Gilbert改进此解释)。

将相关行分组在一起是您必须要做的事情;从您的示例中不清楚源日期的来源。

确保更新CSV输出主要是确保缓冲输出文件行的问题。


正如David M建议的那样,或许您应该查看{{3}}模块来处理问题的连续阅读方面。这应该允许您不断读取输入日志文件。

然后,您可以使用Text :: CSV中的'parse'方法来分割读取行,并使用'print'方法来格式化输出。如何组合来自各种输入线的信息来创建输出线对我来说是个谜 - 我无法从你给出的例子中看出逻辑是如何工作的。但是,我假设您知道您需要做什么,这些工具将为您提供处理数据所需的机制。

没有人可以做更多的事情来为你提供答案。你将不得不为自己做一些思考。您将拥有一个可以通过File :: Tail连续读取的文件句柄;你将有一个CSV结构来读取数据线;您可能会有另一个CSV结构用于写入输出;您将拥有一个输出文件句柄,确保每次写入时都刷新。连接这些点现在是你的问题。