настройка логов в Apache¶

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

Apache - это одно из самых (если не самое) мощных open-source решений для создания веб-серверов. Возможности ведения логов в Apache как для одного сайта, так и для нескольких доменов очень гибки. Большинство возможностей настройки логов применимы для любой операционной системы, но некоторые из них специфичны только для Unix/Linux.

Apache по умолчанию довольно хорошо сконфигурирован для ведения логов одного сайта. Стандартный файл httpd.conf должен иметь раздел логов с подробными комментариями для каждой директивы. Каталог логов по умолчанию находится в /etc/httpd/logs. Позже мы покажем, как изменить этот путь. Теперь давайте рассмотрим раздел настройки логов:

ErrorLog logs/error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log combined


лог ошибок (Error Log)

Лог ошибок содержит сообщения, поступающие от Apache (ошибки, уведомления и т.п.). Этот лог очень полезен для поиска и устранения проблем, возникающих на стороне сервера.

Совет: если вы тестируете ваш сервер, то можете использовать командную строку для интерактивного просмотра логов. Введите “tail –f
/path/to/error_log”. Эта команда выведет несколько последних строк лога, а также продолжит показывать новые сообщения по мере их поступления. Тут возможностей для настройки не так много - кроме возможности указать, где находится файл лога, и какой уровень ошибок вы хотите отслеживать в логе, больше опций нет. Теперь давайте посмотрим на директиву настройки лога ошибок в httpd.conf:

ErrorLog logs/error_log

Если вы хотите сохранять всю информацию об ошибках в один лог, этой директивы хватит (даже для множества доменов). Однако вы можете специфицировать файл лога ошибок для каждого домена. Это делается в секциях <VirtualHost> примерно следующим образом:

<VirtualHost 10.0.0.2>

DocumentRoot "/home/sites/domain1/html/"
ServerName domain1.com
ErrorLog /home/sites/domain1/logs/error.log

</VirtualHost>


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

Уровень ошибок, попадающих в лог, устанавливается следующим образом:

LogLevel warn

В Apache определены следующие уровни ошибок:

- emerg - экстренный – система не функционирует;
- alert - ошибку необходимо немедленно исправить;
- crit - критическая ошибка;
- error – ошибка;
- warn – предупреждение;
- notice - уведомление (нормальное функционирование);
- info - информационное сообщение;
- debug - сообщение отладки.

Имейте в виду, что все последующие уровни включают предыдущие. То есть если мы выставляем уровень в warn, в лог попадут ошибки следующих классов: emerg, alert, crit, error и warn.

контроль активности на сайте

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

Теперь давайте разберем код комбинированного формата сообщения лога:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Строка начинается с LogFormat и сообщает Apache, что вы определили тип файла лога, в данном случае - комбинированный. Сейчас давайте взглянем на символы, которые составляют определение формата сообщения.

%h – IP-адрес клиента (удаленного хоста);

%l - имя пользователя (от identd);

%u - userid удаленного пользователя (полезно при использовании HTTP-авторизации);

%t - дата и время запроса;

%r - строка запроса;

%s - код статуса, отсылаемый сервером клиенту (201, 301, 404, 500, и т.д.). Символ > перед s показывает, что в лог записывается только последний статус;

%b - количество отправленных байтов клиенту (HTTP-заголовки не учитываются);

%i - элементы, передаваемые в HTTP-заголовках. Таким образом, добавляя Referer и User-Agent можно отслеживать ссылающиеся URL и типы браузеров. Если запрошенная информация недоступна, то в логе она заменяется дефисом. Чтобы вставить в лог символ % необходимо использовать %%. Совет №1: Вы можете использовать больше HTTP заголовков. Полный список заголовков можно найти на www.w3.org.

Совет №2. Вы можете изменить разделитель полей в логе (по умолчанию - пробел). Как вариант можно предложить символ табуляции. Зачем это нужно? Во-первых, такие файлы удобно открывать для анализа в редакторах таблиц (том же MS Excel) – все значения автоматически «раскидываются» по колонкам. Может пригодиться и в самописных автоматизированных аналитических системах, где традиционно используются tab delimited файы. Следует заметить, что символ разделителя полей вписывается в конфигурационную директиву что называется as is, то есть если это пробел – жмем пробел, если табуляция – жмем tab :) Модификаторы типа \s и \t apache не понимает.

Для одного сайта достаточно записи по умолчанию:

CustomLog logs/access_log combined

А для множества сайтов есть несколько вариантов. Наиболее простой - это определить отдельный лог-файл для каждого домена. Для этого, как видно из примера ниже, необходимо использовать директивы лога внутри секции <VirtualHost> каждого домена.

<VirtualHost 10.0.0.2>

DocumentRoot "/home/sites/domain1/html/"
ServerName domain1.com
ErrorLog /home/sites/domain1/logs/error.log
CustomLog /home/sites/domain1/logs/web.log combined

</VirtualHost>

<VirtualHost 10.0.0.3>

DocumentRoot "/home/sites/domain2/html/"
ServerName domain2.com
ErrorLog /home/sites/domain2/logs/error.log
CustomLog /home/sites/domain2/logs/web.log combined

</VirtualHost>


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

Для этого надо использовать тип формата лог-файла - сvh (common virtual host, вы, впрочем можете обозвать формат и по-другому). Просто добавляя %v (виртуальный хост) в начало комбинированного формата лога, определенного ранее, мы можем собрать сообщения всех доменов в один лог-файл, а затем автоматически разбить его на отдельные лог-файлы.

LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" cvh

В этом случае мы не используем директиву CustomLog в секциях <VirtualHost>, а просто получаем один лог-файл, сгенерированный Apache. Программа, разбивающая этот файл, называется split_logfile и находится в каталоге src/support в исходниках Apache. Если у вас нет исходников Apache, то для этих целей можно скачать (или написать – делов-то!) скрипт на Perl.

Отдельные лог-файлы создаются из главного файла с именами виртуальных хостов и выглядят так: virtualhost.log.

ротация логов

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

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

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

mv web11.tgz web12.tgz
mv web10.tgz web11.tgz
mv web9.tgz web10.tgz
mv web8.tgz web9.tgz
mv web7.tgz web8.tgz
mv web6.tgz web7.tgz
mv web5.tgz web6.tgz
mv web4.tgz web5.tgz
mv web3.tgz web4.tgz
mv web2.tgz web3.tgz
mv web1.tgz web2.tgz
mv web.tgz web1.tgz
mv web.log web.old
/usr/sbin/apachectl graceful
sleep 300
tar cvfz web.tgz web.old


Этот код может быть скопирован в файл logrotate.sh, и помещен в каталог, где хранится файл web.log (файл лога). Только измените имена лог-файлов на ваши, а также поменяйте права на 755, чтобы файл смог исполняться.

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



Blane Warrene, перевод Сипягина Максима


Сетевые решения. Статья была опубликована в номере 06 за 2006 год в рубрике sysadmin

©1999-2024 Сетевые решения