LINUX.ORG.RU
решено ФорумAdmin

анализ лога

 , ,


0

1

Доброй ночи. Подскажите, пожалуйста, в какую сторону копать для решения такой задачи - есть лог запросов, который постоянно пишется, довольно активный. Мне нужно из потока запроса находить определенные по простому критерию - клиент выполняет определенную последовательность запросов. На примере:

client1 - /
client2 - /
client3 - /
client3 - /url/
client4 - /
client5 - /
client6 - /
client5 - /url/

Из этого набора меня интересуют client3 и client5. Отмечу, что как показано на client5 эти запросы не обязательно последовательны. Но ловить нужно именно последовательность - главная, а потом другая страница.

Вопрос, собственно, чем это удобнее будет регализовать? На bash не выйдет? Потому что мне пока только python вместе с tail -f в голову приходит Важное уточнение - это не пост анализ лога, а в реальном времени.

из твоего примера нихрена не понятно, чем не устраивает

 grep 'client3\|client5' 

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

Ему нужны клиенты которые сначала запрашивают глагне, а потом некоторый /url. Видимо отлавливает какого-то бота.

Засыпающий мозг предлагает читать файл построчно, клиентов запрашивающих корень заносить в список, для клиентов запрашивающих /url/ проверять нет-ли их в списке и если есть то делать что-там-тебе-нужно. Ну и если клиент запрашивает какой-то третий url или запрашивает /url/ до запроса корня то вносить его в белый список

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

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

Программа совершенно детская, пишется левой ногой на любой скриптовой чуши типа perl/php/ruby.

yu-boot ★★ ()

Вопрос, собственно, чем это удобнее будет регализовать? На bash не выйдет?

На tail -f log | awk ... выйдет. Если за основу взять ваш пример из первого сообщения, то можно так:

... | awk '
    ($3 == "/url/"){
        if (url[$1] == "/"){
            printf("client <%s> requested %s after %s\n", $1, $3, url[$1]);
        }
    }
    { url[$1] = $3; }
'

Результат:

client <client3> requested /url/ after /
client <client5> requested /url/ after /

Строки будут выводиться, когда awk во входящем потоке увидит clientX - /url/

spirit ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.