Как начать писать анализатор логов в Perl? - PullRequest
1 голос
/ 07 марта 2011

Получение информации из файла, который выводит запись после записи в следующем формате: IPAddress xx [date: time -x] "method url httpversion" statuscode bytes "referer" "useragent"

Как бы вы поступилидоступ к этому файлу в качестве аргумента командной строки и сохранение этой информации, чтобы вы могли расположить ее в алфавитном порядке по IP-адресам, сохраняя всю информацию вместе?Я предполагаю, что мне нужно было бы как-то использовать хеши и массивы.

Теоретически у вас может быть столько текстовых файлов, сколько вы хотите, в качестве аргументов командной строки, но до сих пор эта часть не работала, у меня просто есть:

./logprocess.pl monster.log #monster.log is the file that contains entries

затем в коде предположим, что все не указанные переменные были объявлены как скаляры

my $x = 0;
my @hashstuff;
my $importPage = $ARGV[0];
my @pageFile = `$importPage`;
foreach my $line (@pageFile)
{

    $ipaddy, $date, $time, $method, $url, $httpvers, $statuscode, $bytes, $referer, $useragent =~ m#(\d+.\d+.\d+.\d+) \S+ \S+ [(\d+/\S+/\d+):(\d+:\d+:\d+) \S+] "(\S+) (\S+) (\S+)" (\d+) (\d+) "(\S+)" "(\S+ \S+ \S+ \S+ \S+)"#
    %info = ('ipaddy' => $ipaddy, 'date' => $date, 'time' => $time, 'method' => $method, 'url' => $url, 'httpvers' => $httpvers, 'statuscode' => $statuscode, 'bytes' => $bytes, 'referer' => $referer, 'useragent' => $useragent);
    $hashstuff[$x] = %info;
    $x++;
}

Определенно есть лучший способ сделать это, так как мой компилятор говорит, что у меня естьглобальные ошибки символов, такие как:

Неоднозначное использование% разрешено как оператор% в ./logprocess.pl строка 51 (# 2) (W неоднозначно) (S) Вы сказали что-то, что может не интерпретироватьсякак ты думал.Обычно его довольно легко устранить, указав пропущенную кавычку, оператор, пару скобок или объявление.

, и он не будет выполнен.Я не могу использовать какие-либо модули.

1 Ответ

4 голосов
/ 07 марта 2011

Если журнал создается Apache, вы можете использовать модуль Apache :: ParseLog .Для вдохновения посмотрите примеры в конце страницы.

Что касается упомянутой ошибки, вы должны объявить свой массив с помощью my:

my @hashstuff;

и добавить туда ссылки.Также к одному элементу можно получить доступ с помощью $hashstuff[$x] (обратите внимание на доллар в начале):

$hashstuff[$x] = { %info };

или вы можете полностью избавиться от $x:

push @hashstuff, { %info };
...