При установке Apache в его файле конфигурации можно найти несколько команд, описывающих как стандартные, так и некоторые дополнительные логи. В первую очередь, это директивы LogFormat и CustomLog.
LogFormat, как можно догадаться из названия, задает формат, в соответствии с которым будут формироваться записи лога. Вторым параметром этой директивы является название формата, которое затем можно будет использовать при описании требуемого лога. Например, в httpd.conf по умолчанию присутствует директива
- Код: Выделить всё • Развернуть
LogFormat "%{Referer}i -> %U" referer
которая описывает формат лога с названием "referer". Если вы затем укажете серверу "задействовать" этот лог, указав, например,
- Код: Выделить всё • Развернуть
CustomLog /var/log/httpd/referer_log referer
то сервер создаст файл /var/log/httpd/referer_log и будет туда записывать, откуда посетитель пришел и какой документ смотрел, в соответствии с описанным вами форматом лога.
Referer-лог - штука полезная, но, попытавшись его включить, вы, скорее всего, будете разочарованы: там появится большая куча записей, у которых вместо referer'a будет указан прочерк (если эта переменная не была передана), и еще большее количество записей, где в качестве referer'ов будут указаны страницы вашего же сайта. Не говоря уже о том, что будут указаны, среди прочего, и обращения к картинкам, файлам CSS и прочим "служебным" вещам, которые веб-мастера, как правило, не сильно интересуют. Значительно интереснее попытаться создать лог, в который бы записывались "честные" внешние ссылки на ваш сайт - это поможет, например, более грамотно работать с рекламой: вы сможете наглядно увидеть, на каких сайтах реклама вашего ресурса более эффективна.
Форматы логов, указанные в настройках по умолчанию, как правило, не очень удобны в "реальной жизни"
Для этого очень удобно использовать директиву SetEnvIf, которая устанавливает какую-то переменную окружения при выполнении указанных вами условий. Эта директива принимает три параметра: атрибут, который будет проверяться; регулярное выражение, которое будет использоваться как условие проверки; переменную, которую надо установить, если условие выполнено. Например, условие
- Код: Выделить всё • Развернуть
SetEnvIf Request_URI ".*/img/.*" no_image
присвоит значение 1 переменной no_image, если в пути запрошенного документа находится директория ./img/.
Директива SetEnvIf устанавливает переменные среды в зависимости от указанных вами условий
В качестве проверяемых атрибутов может использоваться любой заголовок, передаваемый браузером (например, Referer), или же переменные среды, используемые сервером Apache. Наиболее полезными из них являются Request_URI (URLihttp://photoshop.vipcentr.ru " class="glossary-indicator">i, который был запрошен посетителем), Remote_Host (имя хоста, с которого пришел запрос - появляется, только если включена директива HostNameLookups), Remote_Addr (IP-адресi браузера посетителя) и Request_Method (метод запроса - например, POST или GET).
Можно проверять самые разные параметры и в зависимости от результатов проверки выполнять те или иные действия
Значение 1 присваивается переменной автоматически, но вы можете присвоить ей любое другое значение, просто указав, скажем, no_image=15. Кроме того, можно "за один заход" присвоить значения нескольким переменным, указав дополнительные имена в качестве четвертого, пятого и так далее параметров.
Теперь, вооружившись этой полезной директивой SetEnvIf, постараемся определить те записи, которые мы не хотим видеть в логе. Прежде всего, уберем пустые значения referer'a:
- Код: Выделить всё • Развернуть
SetEnvIf Referer "^$" no_referer
После этого уберем записи, где в качестве referer'a указан наш собственный сайт:
- Код: Выделить всё • Развернуть
SetEnvIf Referer ".*mysite\.ru.*" no_referer
И, наконец, "прибьем" ненужные служебные запросы:
- Код: Выделить всё • Развернуть
SetEnvIf Request_URI ".*/img/.*" no_referer
SetEnvIf Request_URI ".*/css/.*" no_referer
Разумеется, если вам требуется исключить еще какие-то записи, то вы можете это легко сделать, просто указав дополнительные проверки. Установка нескольких переменных в одной директиве SetEnvIf может оказаться полезной, если вы хотите настроить не один, а несколько разных логов, в которых используются одинаковые проверки. Например, в обычном access-логе намного удобнее тоже убрать служебные запросы, иначе в дополнение к каждой записи о просмотре пользователем страницы вы получите еще несколько записей о просмотре логотипа, картинки-разделителя и так далее.
SetEnvIf по умолчанию устанавливает значение 1, но можно также установить любое другое значение, а также одновременно установить значение нескольких переменных
И теперь все, что нам осталось сделать - это "объяснить" серверу, что в лог надо писать только те обращения, которые не привели к установке переменной no_referer. Делается это очень просто - достаточно в директиве CustomLog указать необходимое условие:
- Код: Выделить всё • Развернуть
CustomLog /var/log/httpd/referer_log referer env=!no_referer
Здесь первым параметром указан файл, в котором будет храниться наш лог, вторым - имя формата, который надо использовать, а третьим - проверка того факта, что переменная no_referer не была установлена во время предыдущих проверок.
C помощью директивы SetEnvIf можно отобрать те запросы, которые будут записываться в лог
В принципе, на этом можно и закончить. Но вот формат, в котором записывается лог, не очень удобен - в нем отсутствуют время (а оно может быть полезно при последующем анализе), а также параметры запроса. Но тут уж дело остается за вами: все, что требуется - это написать свой собственный формат лога, который будет удовлетворять вашим потребностям и требованиям. В директиве LogFormat можно использовать довольно много разных переменных (смотрите документацию сервера), я же приведу те, которые чаще всего оказываются полезны:
- %a - IP-адрес браузера посетителя;
- %b - количество байт, переданных в ответ на запрос;
- %f - путь файловой системы к запрошенному документу (может отличаться от запрошенного URL!);
- %r - первая строка запроса (включает метод, запрошенный адрес и так далее);
- %t - дата и время запроса;
- %T - время, требуемое на выполнение запроса;
- %U - запрашиваемый адрес (недостатком является "отбрасывание" переменных, которые идут после знака вопроса);
- %v - имя сервера, обрабатывающего запрос (берется из директивы ServerName).
Кроме того, в описании формата можно использовать конструкцию %{header}i, которая подставит значение требуемого заголовка запроса (например, в стандартном формате referer-лога используется %{Referer}i, кроме того, довольно часто может быть полезен идентификатор браузера пользователя - %{User-Agent}i). Аналогично, можно включить в лог и значение какой-то переменной окружения, указав %{env_variable}e (естественно, что вместо "env_variable" надо указать имя требуемой переменной).
Никто не мешает создать собственный формат лог-файла, который будет подходить для ваших нужд больше, чем стандартный
Если по каким-то причинам вам не нравится формат даты, выдаваемой с помощью указания %t, то можно задать свой собственный, указав %{time}t. Здесь вместо "time" надо указать требуемый формат даты - как и с форматом логов, указывая формат даты можно использовать множество переменных, но чаще всего используются
- %A и %a - полное и сокращенное название дня недели
- %B и %b - полное и сокращенное название месяца
- %d - число (без первых нулей)
- %H - часы в 24-х часовом формате
- %M - минуты
- %m - номер месяца
- %S - секунды
- %w - порядковый номер дня недели (воскресенье - 0)
- %Y - год (четыре цифры)
Вот и все. Теперь, осталось только отредактировать файл httpd.conf, запустить
- Код: Выделить всё • Развернуть
/usr/local/apache/bin/apachectl configtest
чтобы убедиться, что вы не написали в конфигурации ничего, что сервер посчитал бы оскорбительным, и перезапустить сервер с помощью
- Код: Выделить всё • Развернуть
/usr/local/apache/bin/apachectl restart
Удачи!
Всегда запускайте утилиту apachectl с параметром configtest перед перезапуском сервера - она предупредит вас в том случае, если вы допустили ошибку в файле конфигурации!
Первоисточник - hostinfo.ru