Как я могу прочитать постоянно обновляемый файл журнала в Perl? - PullRequest
0 голосов
/ 14 мая 2010

У меня есть приложение, генерирующее журналы каждые 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 Ответ

2 голосов
/ 14 мая 2010

Модуль Text :: CSV позволит вам как читать, так и записывать файлы в формате CSV. Text :: CSV будет внутренне использовать Text :: CSV_XS , если он установлен, или будет использовать Text :: CSV_PP (спасибо Брэду Гилберту за улучшение этого объяснения).

Группировка связанных строк - это то, что вам нужно сделать; из вашего примера неясно, куда отправляется исходная дата.

Обеспечение обновления вывода CSV - это прежде всего вопрос обеспечения буферизации строки выходного файла.


Как предположил Дэвид М, возможно, вам следует обратиться к модулю File :: Tail , чтобы разобраться с аспектом проблемы, связанным с непрерывным чтением. Это должно позволить вам постоянно читать из входного файла журнала.

Затем вы можете использовать метод parse в Text :: CSV для разделения строки чтения и метод print для форматирования вывода. То, как вы комбинируете информацию из различных входных строк для создания выходной строки, для меня загадка - я не могу понять, как работает логика из приведенного вами примера. Однако я предполагаю, что вы знаете, что вам нужно делать, и эти инструменты предоставят вам механизмы, необходимые для обработки данных.

Никто не может сделать намного больше, чтобы накормить вас ответом. Вам придется подумать для себя. У вас будет дескриптор файла, который можно непрерывно читать с помощью File :: Tail; у вас будет структура CSV для чтения строк данных; у вас, вероятно, будет другая структура CSV для письменного вывода; у вас будет дескриптор выходного файла, который, как вы убедитесь, сбрасывается при каждой записи. Соединение этих точек теперь ваша проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...