Анализ логов

Oct 01, 2009 14:57

Сделал тут себе на Окамле анализатор логов с гейшами и го, способный отвечать на всякие каверзные вопросы о том, что за публика ходит ко мне на сайт, откуда, зачем и что там делает. Например, я могу его спросить по каким ключевым словам приходили люди из Германии, Японии и Штатов с поисковика bing на страницы, содержащие строку 'Press'. И получить наглядный ответ за 0.07 секунды на наборе из 2 гигабайт логов.




Или спросить с каких блогов приходили люди, если отбросить Тайвань, Китай, Таиланд и Гонконг:



Или узнать какие файлы запрашивались, когда сервер выдал такой-то код статуса:




Или посмотреть какова география пришедших ко мне с РСДН:




А вот, кстати, география гостей из ЖЖ:




Или с каких сайтов приходят люди с американским IP:




Или что ищут приходящие в русскоязычный раздел сайта:




Интересно, что именно искал человек по запросу "программы для увеличения скачивания"? :)

Вообще, изучать географию оказалось довольно познавательно. Я никогда раньше не думал, что файлопомойки (каталоги софта) так сильно отличаются по своей аудитории. Например, на snapfiles.com практически одни китайцы.




А на fileguru.com - индусы, американцы и европейцы. Первым, похоже, название очень нравится. :)




В то же время архив sof32.com населен тайцами:




Некоторые различия есть и среди аудитории поисковиков, хоть и не такие большие. У яху китайцев побольше. Количественно, конечно, гугл всех других поисковиков опережает очень сильно по числу приходящих людей. Распределение по национальным доменам гугла выглядит вот так:




Многие вопросы можно задать одним кликом мыши - рядом с каждым объектом есть набор коротких ссылок, по которым выдается разнообразная инфа про данный объект. Но есть и встроенный SQL-подобный язык запросов. Он семантически отличается от SQL, дабы каждый раз не писать, что я хочу сразу видеть и хиты, и посетителей, и суммарный траффик, и число закачек и не описывать как это все считается. Ключевые слова имеют синонимы, например вместо select можно написать show, а можно вообще ничего не писать. Вместо where также допустим for. Вместо sort by можно писать просто sort или by. По умолчанию сортирует по числу уникальных посетителей. Посетитель идентифицируется сочетанием IP, браузера и даты.

В необязательной клаузе where могут быть сложные выражения, состоящие из простых (а равно б, а имеет подстроку б, а входит в набор из б,в,г), их отрицаний и комбинаций через and и or. Запросы разбираются рекурсивными парсер-комбинаторами в нечто вроде AST, из которого могут быть обратно сформулированы в виде запроса, в виде словесного описания, а также "скомпилированы" в функцию фильтрации данных, используемую при обработке запроса.

Логи читаются один раз при загрузке (пара гигов загружается секунд за 30, это сопровождается отображением прогресса, про что недавно писал), при этом строится их компактное представление, и памяти в процессе работы жрется примерно 10% от их исходного размера. Дальше все работает in-memory, большинство запросов обрабатывается за доли секунды.

Все счастье - около 1100 строк кода, из них
250 - встроенный вебсервер,
160 - разбор логов и создание их компактного представления,
100 - описание запросов, их парсинг, анпарсинг,
90 - библиотека парсер-комбинаторов,
70 - загрузка и разбор базы принадлежности адресов к странам, определение страны по IP,
40 - библиотека для профилирования,
30 - генерация картинок средствами Google Charts API,
50 - HTML, CSS и JavaScript.

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

На данном проекте в очередной раз понял главную проблему функциональных языков - с ними чего только не сделаешь, лишь бы не возвращаться к проектам на С++. :)

ocaml, fp, log analysis

Previous post Next post
Up