LINUX.ORG.RU
ФорумAdmin

Самый простой способ парсинга временных интервалов логов

 , , , ,


0

3

К примеру, необходимо пропарсить логи вида

...
1971-01-01 11:11:11 Bla bla bla
...
по временным интервалам, т.е. с 06:30 до 12:30. Чем Вы пользуетесь? Регулярки? Perl? Сторонние инструменты?

★★★★★

Регулярками.

Как-то так

grep -E 'Mar 11 (6:[3-5][0-9]|12:[1-3][0-9])'

shell-script ★★★★★ ()

Как уже сказали - регулярки в grep'е. Только если файл большой и нужно будет много парсить в этом временном промежутке то сначала грепаю по времени в отдельный файл, а дальше по нему уже ищу. Кстати, нужно было как-то прогрепать лог на пару гигабайтов, посмотреть сколько обращений с каждого адреса приходит, так грепать каждый раз этот большой файл получилось быстрее, чем для каждого адреса считать количество вхождений а потом sed'ом удалять эти строки из файла (я думал что раз файл будет каждый раз уменьшаться то получится быстрее, но получается только дольше из-за того что sed постоянно временные копии файла делает и потом подменяет основной).

alozovskoy ★★★★★ ()

Как-то так, но думаю, что можно лучше. И тут надо быть аккуратным с lt, gt - зависит от формата даты.

perl -nle 'm/^(\d+-\d+-\d+ \d+:\d+:\d+)/; print if $1 gt "1971-01-01 11:11:17" && $1 lt "1971-01-03 11:11:18"' log
Можно поробовать диапозон в регулярку засунуть, но мне лень.

anonymous ()

У меня еще была идея с unixtime - наверное не верный подход =)

int13h ★★★★★ ()

1. выкинуть дефолтный syslog, хранить логи бинарно. Systemd, например.
или 2. Хранить логи в sql, юзать SELECT
или 3. Хранить логи в спец хранилищах типа Logstash

Пользоваться регулярками - маразм. Никого не смущает, что там даже ГОД не указан, а только месяц и день?

P.S. Почему регулярки маразм? Вдруг придется искать логи с 1999.12.30 по 2000.01.01. Пример рабочей регулярки?

Bers666 ★★★★★ ()
Последнее исправление: Bers666 (всего исправлений: 1 )
Ответ на: комментарий от anonymous

Но я таки за спецализированное решение. Такой способо нормальный для эпизодических применений.

anonymous ()
Ответ на: комментарий от Bers666

syslog-ng, rsyslog давно умеют нативно в SQL.

Почему регулярки маразм? Вдруг придется искать логи с 1999.12.30 по 2000.01.01. Пример рабочей регулярки?

Из личного опыта, обычно это будет 100500 файлов по дням. Грепаются на ура, параллелится на ура. Ты не в теме. В твоем случае 3 файла.

gh0stwizard ★★★★★ ()
Последнее исправление: gh0stwizard (всего исправлений: 1 )
Ответ на: комментарий от Bers666

Никого не смущает, что там даже ГОД не указан, а только месяц и день?

Эм, вообще-то современные реализации syslog умеют в кастомный формат даты.

Pinkbyte ★★★★★ ()
Ответ на: комментарий от gh0stwizard

обычно это будет 100500 файлов по дням.

если логов мало - может по неделям или месяцам

Pinkbyte ★★★★★ ()
Ответ на: комментарий от gh0stwizard

это будет 100500 файлов по дням.

ничего, что обычно logrotate в 6.25 работает?

Bers666 ★★★★★ ()
Ответ на: комментарий от Pinkbyte

Эм, вообще-то современные реализации syslog умеют в кастомный формат даты.


Таки да, если кастомизировать syslog, так лучше сразу в sql слать

Bers666 ★★★★★ ()
Ответ на: комментарий от anonymous

Что-то в этом духе?

Нет. В 99% случаев будет Dec 31 & Jan 1. Пока не сконфигуришь syslog. Но лучше уж сразу конфигурять на посылание в sql, а не полумеры в виде strftime.

Bers666 ★★★★★ ()
Ответ на: комментарий от Bers666

Сорь, в ОП посте вполне определённый формат.

anonymous ()
Ответ на: комментарий от anonymous
 perl -nle 'm/^(\d+-\d+-\d+ \d+:\d+:\d+)/; print if $1 gt "1971-01-01 11:11:17" && $1 lt "1971-01-03 11:11:18"' log 

^^^^^^^^

На самом деле вот это извлечение по паттерну не нужно, можно просто сравнить саму строку, которая в перле $_ , и граничные даты, ведь мы сравниваем строки.

perl -nle ' print if $_ gt "1971-01-01 11:11:17" && $_ lt "1971-01-03 11:11:18"' log
Bers666 ★★★★★ ()
Ответ на: комментарий от Deleted

Век воли не видать - не ради срача. Просто хочу знать как пипл с логами работает

int13h ★★★★★ ()
Ответ на: комментарий от Bers666

Действительно, здорово, даже не подумал об этом.

anonymous ()
Ответ на: комментарий от necromant

а почему в Perl никто DateTime не пользуется - медленно и много писать?

Это монстр-комбайн. Если его и использовать, то на полную катушку. А если брать 1-2 фичи из него, то: а) есть более легкие и быстрые альтернативы; б) накостылять велосипед также чаще проще и работать будет быстрее. В остальном, модуль как модуль.

gh0stwizard ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.