Web-Anatomy.Ru

Десятилетию Рунета посвящается

К выпуску № 16 («Вообще и в частности»)

Предлагаем вашему вниманию ознакомиться с возможностями веб-приложения ALLA (Artemy Lomov’s Log Analyzer) и, при желании, скачать его себе.

ALLA представляет собой CGI-скрипт, написанный на языке Perl. Его назначение — расширенный поиск записей в лог-файлах журнала доступа веб-сервера, представленных в комбинированном формате NCSA, по значениям отдельных полей с возможностью использования регулярных выражений.

Мы не будем рассматривать код скрипта, поскольку, с одной стороны, он довольно объемен (более 20 Кбайт), а с другой стороны, в достаточной степени удобочитаем и содержит в себе все необходимые комментарии. Полагаю, веб-разработчики, сколько-либо владеющие языком Perl, без труда разберутся с кодом и, если возникнет такая необходимость, смогут адаптировать его под свои потребности.

(По логике вещей, здесь необходим подобающий случаю disclaimer о том, что скрипт разрабатывался «под себя», хотя в то же время я старался сделать его юзабельным и для других пользователей; что программа, как и все сущее в этом мире, отнюдь не лишена недостатков; что автор снимает с себя какую бы то ни было ответственность за возможный вред, который может быть нанесен скриптом чему бы то ни было, будь то веб-сервер, чья-нибудь неокрепшая психика или государственная безопасность. Но, полагаю, вы и без моей помощи начитались уже подобных напутствий, поэтому, не растекаясь мыслью по древу, перейдем сразу к делу.)

Итак, предлагаем скачать один из следующих архивов:

К сожалению, у меня нет возможности продемонстрировать ALLA в действии в режиме онлайн, поскольку, во-первых, поймите меня правильно, я не могу доверить копаться в логах своего сервера всем желающим, а во-вторых, исследование логов в реальном времени все-таки порождает ощутимую нагрузку на сервер. Одно дело, когда скрипт время от времени запускает один администратор, и совсем другое — когда программу пытаются эксплуатировать и в хвост и в гриву одновременно по 50 человек. Кстати, мой вам дружеский совет: если надумаете использовать ALLA, не забудьте закрыть паролем директорию, в которую будете скрипт помещать. От греха подальше.

И все-таки, я не могу оставить вас без удовольствия полюбоваться на ALLA во всей своей красе. А поэтому — внимание, бонус:

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

Дальнейшее повествование — в основном для тех, кому все-таки до сих пор жаль «просаживать» мегабайт трафика. Хотя и остальным будет наверняка полезно почитать.

Что представляет собой файл журнала доступа? Фактически, это не что иное, как текст с разделяемыми полями. Каждому обработанному клиентскому запросу соответствует отдельная строка. Всякая строка, в свою очередь, состоит из нескольких полей, разделенных пробелами. Внутри содержимого поля также допускаются пробельные символы, но при этом оно должно быть обрамлено двойными кавычками (или квадратными скобками, как в случае с полем, отражающим дату и время обработки запроса). Как уже отмечалось, текущая версия скрипта поддерживает только комбинированный (combined) формат лог-файлов веб-сервера, включающий в себя 9 полей:

Типичная запись лога в комбинированном формате выглядит примерно так («прочерки» — дефисы — обозначают то же, что и в повседневной жизни):

ip107-166.dialup.wplus.net - - [12/Sep/2004:15:23:06 +0400] "GET / HTTP/1.1" 200 24210 "http://www.yandex.ru/yandsearch?text=%E2%E5%E1-%E0%ED%E0%F2%EE%EC%E8%FF" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"

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

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access.log combined

ALLA разбирает каждую запись на отдельные поля при помощи сложного регулярного выражения.

В состав каждого из архивов 16.1 — 16.3 входят следующие файлы: alla.pl — собственно скрипт, и allaconf.txt — конфигурационный файл к оному.

ALLA, как уже говорилось, является обычным CGI-скриптом, поэтому файл alla.pl нужно разместить в соответствующей директории сервера (по умолчанию — cgi-bin) и наделить необходимыми правами доступа (в UNIX-системах — 755). Файл allaconf.txt должен размещаться в том же самом каталоге, что и alla.pl. В конфигурационном файле скрипта задается относительный путь к лог-файлу журнала доступа веб-сервера:

logfile ../logs/access.log

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

По умолчанию найденные записи выводятся в неформатированном строковом виде. Но можно получить и красивый табличный отчет, если добавить в allaconf.txt такую строчку:

output extended

При этом следует помнить, что загрузка отчета с «обогащенным» форматированием отнимает больше времени — в особенности это заметно при удаленном доступе при помощи модема. А обладателям выделенных линий следует задуматься об экономии трафика.

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

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

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

Что ж, остается привести несколько примеров запросов.

Вот один из самых простых. Позволяет получить информацию обо всех HTTP-запросах ресурсов, в адресах коих присутствует подстрока index:

Ресурс: index

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

Скрипт разрабатывался с тем расчетом, чтобы в полях формы можно было использовать регулярные выражения. Вот примерчик посложнее:

Ресурс: (^\/$|\.(s|x)?htm(l)?$)
Код ответа: 200

Отчет по такому запросу предоставит информацию обо всех успешных (завершившихся кодом 200) клиентских запросах статичных страниц сайта (корневого каталога и файлов с масками *.htm, *.html, *.shtm, *.shtml, *.xhtm, *.xhtml).

Следующий, еще более изощренный запросик, выводит отчет обо всех успешно обработанных запросах динамических страниц (*.cgi, *.pl, *.php) в рабочее время суток (с 9:00 до 18:00):

Ресурс: \.(cgi|pl|php)
Время: С 9:00 по 17:59
Код ответа: 200

А вот как можно получить данные обо всех запросах статических страниц, которые (запросы то бишь, а не страницы) могут потенциально являться обращениями с поисковиков:

Ресурс: (^\/$|\.(s|x)?htm(l)?$)
Реферал: %

(Символ «%» указывает на наличие в URL закодированных символьных последовательностей, которые с высокой вероятностью являются поисковыми строками. В отчете они будут видны.)

Интересуют не все поисковики, а только «Яндекс»? Так и скажите:

Ресурс: (^\/$|\.(s|x)?htm(l)?$)
Реферал: yandex\.ru

Если мы хотим узнать, кто и сколько раз загружал конкретный файл, к примеру, /photos/bestphoto.jpg, нет ничего проще выяснить это при помощи ALLA:

Ресурс: ^\/photos\/bestphoto.jpg$

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

Ресурс: ^\/photos\/bestphoto.jpg$
Число байт, переданных в ответе: до 555665

Отчет, выявляющий все запросы, повлекшие ошибку 404 Not Found — великолепный инструмент для обнаружения «битых» ссылок. Причем не только тех, которые наличествуют на страницах исследуемого сайта, но и тех, что ведут с других сайтов:

Код ответа: 404

А вот более общий запрос — все случаи ошибок с кодами 4xx и 5xx:

Код ответа: ^(4|5)\d\d$

И, внимание, тот самый обсуждавшийся в тексте колонки запрос, выявляющий любопытного, пытающегося безуспешно проникнуть в закрытую зону узла под именем admin:

Имя пользователя: admin
Код ответа: 401

Определив IP-адрес этого проходимца, можно отследить все его перемещения по сайту:

Адрес удаленной машины: 212.48.128.130

А вот так можно легко «поймать» всех пользователей, запросивших корень сервера при помощи браузера Internet Explorer 5.5:

Ресурс: ^\/$
Информация о системе клиента: MSIE 5\.5

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

И, конечно же, вы теперь наверняка сможете придумать еще миллион разнообразных примеров использования ALLA.

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

[Перейти к оглавлению]

© Артемий Ломов, 2004, 2005.