Нужно отфильтровать журнал для поиска строк за последние 5 минут - PullRequest
3 голосов
/ 25 апреля 2011

2011-04-13 00: 09: 07,731 INFO [STDOUT] 04/13 00:09:07 Информация ...

Привет всем. Я бы опубликовал часть своего кода, но я даже не думаю, что он достоин публикации. То, что я пытаюсь сделать, это то, что у меня есть файл журнала со строками, как указано выше. Что мне нужно сделать, это взять отметку времени последних строк и сохранить все строки за последние 5 минут (а не за последние 200 строк или что-то еще .... что было бы проще). Может ли кто-нибудь помочь? Я искал в Интернете несколько приличных советов, но все равно ничего не получалось и расстроился до чертиков. Спасибо!

Ответы [ 4 ]

5 голосов
/ 25 апреля 2011

Вот простой Perl-скрипт, который перебирает файл и печатает каждую строку, отметка времени которой находится в пределах 5 минут от времени в начале выполнения.Для большей эффективности и при условии, что строки расположены в порядке отметки времени, вы можете изменить это, чтобы установить логический флаг, когда он встречает первую печатаемую строку, и пропустить тестирование с этой точки вперед.

#!/usr/bin/perl
use POSIX qw(mktime);

$now = time();
while(<>)
{
    ($yy,$mm,$dd,$h,$m,$s,$t) = /^(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+),(\d+)/;
    $t = mktime($s+$t/1000, $m, $h, $dd, $mm-1, $yy-1900);
    print "$_" if ($t >= $now-300);
}
2 голосов
/ 28 апреля 2011

Я полагаю, что из вашего последнего комментария вы заинтересованы в том, чтобы узнать, как найти последнюю отметку времени в вашем журнале и записи за 5 минут до этого.

Я думаю, что решение Джима Гаррисонаможет быть исправлено, чтобы заменить это:

$now = time();

на это:

open F, "<server.log" or die $!;
seek F,-1000,2; # set pos to last 1000 bytes
my @f = <F>;
$_ = $f[$#f];
($yy,$mm,$dd,$h,$m,$s,$t) = /^(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+),(\d+)/;
$now = mktime($s+$t/1000, $m, $h, $dd, $mm-1, $yy-1900);

$now теперь должен содержать последнюю метку времени в журнале.

I приблизительно "-1000 ", чтобы быть достаточно длинным, чтобы пройти хотя бы одну строку в журнале.Вы можете установить его намного выше, если вы ожидаете, что в журнале будут длинные строки, но, как я увидел, последняя запись в журнале «должна» быть довольно короткой.

Если у вас огромный файл журнала и вы хотитеЧтобы повысить производительность в следующем поиске, вы можете использовать оценку и выполнить поиск, чтобы найти последние, скажем, 1000000 байт в файле с:

seek F, -1000000, 2;

Удачи!

1 голос
/ 25 апреля 2011

Выполните итерацию по всем строкам, используя regexp grab: 00:09:07, и проверьте текущее время (местное время и т. Д.). если файл содержит записи с разными датами, также захватите даты с помощью регулярного выражения и снова сравните, используя вывод locatime

0 голосов
/ 26 декабря 2013

Как изменить скрипт, чтобы он работал с журналами ниже

Dec 18 09:41:18 sd
Dec 18 09:46:29 sds
Dec 18 09:48:39 sds
Dec 18 09:48:54 sds
Dec 18 09:54:47 sds
Dec 18 09:55:33 sds
Dec 18 09:55:38 sds
Dec 18 09:57:58 sds
Dec 18 09:58:10 sds
Dec 18 10:00:50 sdsd
Dec 18 10:03:43 sds
Dec 18 10:03:50 sdsd
Dec 18 10:04:06 sdsd
Dec 18 10:04:15 sdsd
Dec 18 10:14:50 wdad
Dec 18 10:19:16 sdadsa
Dec 18 10:19:23 dsds
Dec 18 10:21:03 sadsd
Dec 18 10:22:54 adas
Dec 18 10:27:32 qadad
...