Логи в Apache
Автор: Игорь Чеботарев
Каждому из нас хочется побыть "большим братом" и
последить за своими посетителями. Это можно делать по-разному: поставить
счетчик, например, HotLog, поставить особый скрипт, ну а некоторые делают
это с помощью логов Apache. Да-да, вы не ослышались, Apache тоже ведет
логи.
На практике необходимо понять значение всего двух
директив: LogFormat и CustomLog. Есть еще директива ErrorLog, но лично я
использую лог ошибок только для просмотра последних строчек, когда Apache
не пускается. Все-таки скажу несколько слов о ErrorLog.
Сами разработчики считают лог ошибок сервера, создающийся
директивой ErrorLog, и хранящий все сообщения об ошибках и всю
диагностику, наиболее важным логом. Не верьте им. Еррор-лог создается так:
ErrorLog
logs/error_log
Практически никак не настраивается, однако есть важная
директива LogLevel. Она дает указания серверу писать или не писать в лог
ошибки различной степени тяжести. Например, директива
LogLevel emerg
Заставит сервер жаловаться только на самые критические
проблемы, когда сервер не запускается. Далее параметры по убывающей:
alert, crit, error, warn, notice, info и, конечно же, мой любимый
LogLevel debug
При котором вам будет рассказано даже о том, что сервер
все-таки открывает в данный момент файл конфигурации :)
Таким образом, если вам нужны логи ошибок, то в
httpd.conf следует указать директиву ErrorLog с параметром "имя лога"
(путь считается относительно ServerRoot) и LogLevel с параметром "степень
точности". Далее все на вашей совести :)
Теперь о том, что считаю важным я: Combined Logs. Эти
логи повествуют о том, кто, когда и зачем отправлял запросы к серверу.
Правда, интересно? Здесь еще две директивы: LogFormat и CustomLog.
Покопайтесь в каком-нибудь httpd.conf и вы обязательно увидите там
что-нибудь типа
LogFormat "%h %l %u %t
\"%r\" %>s %b" common CustomLog logs/access_log common
Хех, все понятно? Сейчас объясню что это значит.
LogFormat принимает два параметра: описание формата лога и название этого
формата. Как видите, лог, состоящий из "%h %l %u %t \"%r\" %>s %b"
называется common. А что значат закорючки, читайте тут:
%h - IP клиента. Кстати,
это запросто может быть и ип его прокси.
%l - это что-то
непонятное, касающееся идентификации клиента по RFC 1413. Кстати, апач не
пытается ее определить, если только директива IdentityCheck не установлена
в On
%u - то, что было введено
в качестве имени пользователя а HTTP-авторизации. То же самое, что и
$HTTP_AUTH_USER :)
%t - время поступления
запроса. В комментариях не нуждается.
%r - строка запроса
клиента, например "GET /xxx.gif HTTP/1.1". Обычно заключается в кавычки,
но поскольку кавычки - спецсимволы, они предваряются бэкслэшами - \. Таким
образом, то, что будет выглядеть в логе как строчка в кавычках,
оформляется так: \"%r\"
%>s - код ответа
сервера клиенту.
%b - размер ответа
клиенту. В байтах.
%{Referer} - адрес
страницы, откуда пришел посетитель.
%{User-agent} - тип
браузера посетителя. Этот и предыдущий параметр тоже обычно указывают в
кавычках, как и %r
Эти параметры можно комбинировать в любом порядке и в
любом количестве. Захотите определять только IP посетителей - пишете так:
LogFormat "%h" iponly
Вот и определен новый формат лога. В общем, комбинируйте
как хотите. Но логи эта директива не создает. Чтобы сервер начал писать
лог, надо потребовать этого директивой CustomLog, которая принимает два
параметра: имя файла лога и его тип. Таким образом, чтобы записывать IP
клиентов, надо добавить еще и такую строчку:
CustomLog logs/iponly.log
iponly
И только после этого лог начнет нормально вестись.
Кстати, популярным считается стандарт "combined log", описывающийся так:
LogFormat "%h %l %u %t
\"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Как видите, довольно информативно. А теперь на минуту
представьте себе, что ваш сервер обрабатывает около миллиона запросов в
день. И вам охота вести несколько логов. Ну это обычное явление: сколько
скажете раз CustomLog, столько логов и создастся, а ну как вам захочется
всех поисковиков, ищущих robots.txt писать в отдельный лог? Ладно.
Рассказываю.
Есть еще такая полезная директива SetEnvIf (или
SetEnvIfNoCase - то же самое, но без учета больших/маленьких букв), она
позволяет в зависимости от условия определять переменные среды. Например:
SetEnvIf Request_URI
"^robots\.txt$" crawler
После этого переменная env будет равняться "crawler". Но
это еще не все! В зависимости от значения этой переменной вы можете делать
запись в разные логи! Вот так:
CustomLog logs/crawlers
combined env=crawler CustomLog logs/clients combined env=!crawler
Вот так, нашему апачу палец в рот не клади :) Не буду
рассказывать почему robots.txt так странно написано, называется это
регулярные выражения, а почитать про них можно либо в учебнике, либо в
странице мануала перла по имени perlre. Вот так: man perlre. Под юниксом,
конечно :)
Уфф... Все, вроде? Нет, есть еще пипы. Пипы (pipes)
позволяют предварительно (прежде чем чего-то в логи записать), что-нибудь
эдакое с ними сотворить, например сжать. Стандартный значок пипы в юниксе
- вертикальная палка, так что если вам приспичит логи сразу сжимать,
делайте так:
CustomLog "|/usr/bin/gzip
-c >> /var/log/access_log.gz" common
Все под юниксом :) Просто потому, что если у вас апач на
винде, то логи вести незачем - врядли она у вас сервером работает %)
P.S. Большая часть этого материала - вольный перевод
соотвествующих статей из Apache Manual. Он лежит здесь:
http://httpd.apache.org.
P.P.S. Счастья вам и радости!
P.P.P.S. Ах, да... удобно, если надо что-то проверить в
работе сервера, следить за логом в "реальном времени", вот так:
$ tail -f
/etc/httpd/logs/logfile