Обработка логов

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

В общем случае, когда вам нужно получить агрегированные данные по посещаемости (например, количество просмотров страниц по месяцам или самые популярные страницы), лучше всего использовать лог-анализаторы — специальные программы, которые автоматически обрабатывают лог-файлы и выдают готовые отчеты. Про лог-анализаторы я буду писать отдельно. В этом же посте я хочу рассказать про частные случаи работы с логами, когда лог-анализаторы использовать невозможно или неэффективно по тем или иным причинам.

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

Чтобы сократить время работы, обрабатывать логи нужно в два этапа:
1. Очистка лога от ненужных записей с помощью потокового текстового редактора и сохранение получившейся выборки в новом файле.
2. Загрузка «очищенного» лога в базу данных (Access, Excel или другую) или в программу обработки статистики (например, SPSS) для последующего анализа.

Для очистки логов я использую редактор Sed. Википедия пишет, что он доступен почти для любой операционной системы, но чтобы не заморачиваться с его установкой под Windows, я использую Sed, встроенный в Cygwin (это такой эмулятор Unix, который можно легко установить на Windows).

Алгоритм подготовки Sed к работе такой:
1. Скачиваете Cygwin с официального сайта;
2. Устанавливаете его себе на компьютер (без хитростей, выбирая рекомендуемые настройки);
3. Запускаете установленный Cygwin.

Далее в командной строке Cygwin можно вводить команды редактора Sed. В Интернете есть большое количество справочников по командам Sed.

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

Пример 1.
Нужно выбрать из лог-файла все просмотры страниц.

Вводим следующую команду:

sed -f cleaner.sed site.log > site_pageviews.txt

где site.log — исходный лог-файл, site_pageviews.txt — «очищенный» лог-файл, cleaner.sed — файл с командами Sed следующего содержания:

1,4d;
/\.gif/d;
/\.rss/d;
/\.jpg/d;
/\.dll/d;
/\.jpeg/d;
/\.bmp/d;
/\.BMP/d;
/\.mp3/d;
/\.GIF/d;
/\.htc/d;
/\.JPG/d;
/\.js/d;
/\.css/d;
/\.xml/d;
/\.flv/d;
/\.png/d;
/\.PNG/d;
/\.axd/d;
/\.ico/d;
/\.swf/d;
/\.htm/d;
/\.txt/d;
/Mediapartners-Google/d;
/WinHTTP+Robot/d;
/libwww-perl/d;
/msnbot/d;
/Yahoo/d;
/AportCatalogRobot/d;
/Yandex/d;
/Googlebot/d;
/igdeSpyder/d;
/Refer.Ru/d;
/Microsoft+Data+Access+Internet+Publishing/d;
/yacybot/d;
/LWP::Simple/d;
/Yeti/d;
/StackRambler/d;
/EnaBot/d;
/MSFrontPage/d;
/websitepulse/d;
/lwp-request/d;
/Trailfire-bot/d;
/Tailrank/d;
/YaDirectBot/d;
/CazoodleBot/d;
/Charlotte/d;
/Wget/d;
/DobroBot/d;
/web.archive.org/d;
/ia_archiver/d;
/walhello/d;
/VadixBot/d;
/Grub/d;
/Mail.ru/d;
/Mail.Ru/d;
/Begun+Robot/d;
/Spider/d;
/MLBot/d;
/Gigabot/d;
/Snapbot/d

Самая первая команда — 1,4d; — удаляет из лог-файла строки с 1 по 4. В этих строках содержится служебная информация (дата формирования лога, названия полей и т.п.), которая нам не нужна.

Команды вида /\.gif/d; удаляют из лог-файла строки, содержащие соответствующие расширения запрошенных файлов (в данном примере изображений формата GIF), то есть запросы к файлам и документам, не являющимся просмотрами страниц.

Остальные команды, например, /Yandex/d;, удаляют строки, содержащие названия ботов — запросы, сделанные поисковыми и другими ботами, нам также не нужны.

Пример 2.
Нужно выбрать из лог файла только запросы к файлам PDF.

Вводим следующую команду:

sed -n -e ‘/\.pdf/p’ site.log > site_pdf.txt

где site.log — исходный лог-файл, site_pdf.txt — лог-файл c записями запросов к файлам с расширением .pdf.